当前位置: 首页 > 知识库问答 >
问题:

类型“Null”不是类型“Function”的子类型

李建中
2023-03-14

我是新手。我正在开发一个测验应用程序,并拥有以下三个dart文件

主要的飞奔

import 'package:flutter/material.dart';
import './answer.dart';
import './question.dart';

void main(){
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  State<StatefulWidget> createState(){
    return _MyAppState();
  }
}

class _MyAppState extends State<MyApp>{
  var _questionIndex = 0;
  _answerQuestion(){
    setState(() {
      _questionIndex = _questionIndex + 1;
    });
}
  @override
  Widget build(BuildContext context) {
    var questions = [
      {'questionText': 'What\'s your favourite color ?',
        'answers': ['Red','Blue','White','Black']
      },
      {'questionText': 'What\'s your favourite Animal ?',
        'answers': ['Dog','Rabbit','Tiger','Monkey']
      },
      {'questionText': 'What\'s your favourite Day ?',
        'answers': ['Tuesday','Monday','Sunday','Friday','Wednesday','Saturday']
      },
    ];
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('My First App'),
        ),
        body: Column(
          children: [
            Question(questions[_questionIndex]['questionText'] as String,
            ),
            ...(questions[_questionIndex]['answers'] as List).map((answer) {
              return Answer(_answerQuestion(),answer);
            }).toList()
    ],
        )
      ),
    );
  }
}

question.dart

import 'package:flutter/material.dart';


class Question extends StatelessWidget {
  final String questions;
  Question(this.questions);

  @override
  Widget build(BuildContext context) {
    return Container(
      width: double.infinity,
      margin: EdgeInsets.all(10),
      child:(
      Text(
      questions,
      style: TextStyle(
          fontSize: 25),
      textAlign: TextAlign.center,)
    ),
    );
  }
}

answer.dart

import 'package:flutter/material.dart';

class Answer  extends StatelessWidget {
  final Function buttonHandler;
  final String answer;

  Answer(this.buttonHandler,this.answer);

  @override
  Widget build(BuildContext context) {
    return Container(
      width: double.infinity,
      child: ElevatedButton(
        child: Text(answer),
        style: ButtonStyle(
            backgroundColor: MaterialStateProperty.all(Colors.blue),
            foregroundColor: MaterialStateProperty.all(Colors.white)
        ),
        onPressed: () => buttonHandler,
    ),
    );
  }
}


当我在android studio中的android上运行应用程序时,出现以下错误:

══╡ 小部件库捕获的异常╞═══════════════════════════════════════════
生成MyApp时引发了以下类型的错误(脏,状态:_MyAppState#7f7de):
类型“Null”不是类型“Function”的子类型。
导致错误的相关小部件是:
MyAppfile:///C:/src/first_app/lib/main.dart:7:10

共有3个答案

章岳
2023-03-14

您的代码运行良好,尝试清理颤振

张和豫
2023-03-14

首先,您必须传递一个函数结构,而不是通过调用它从函数中返回值。

您在下面声明了此函数:

_answerQuestion(){
    setState(() {
      _questionIndex = _questionIndex + 1;
    });
}

并传递返回值而不是函数结构,如下所示:

return Answer(_answerQuestion(),answer);

如您所见,_answerQuestion()的返回值为Null。像这样更改您的代码。

return Answer(_answerQuestion,answer);

你需要调用Answer组件中的函数。

onPressed: buttonHandler

onPressed: () => buttonHandler()
酆出野
2023-03-14

这:

onPressed: () => buttonHandler,

需要是:

onPressed: buttonHandler,

onPressed: () => buttonHandler(),

取决于处理程序是否与所需的签名完全匹配。

此外,这:

return Answer(_answerQuestion(),answer);

需要

return Answer(_answerQuestion,answer);

一般来说,你已经混合调用一个方法和传递一个方法作为参数几次了,你可能想更熟悉它。

 类似资料: