【问题标题】:type 'Null' is not a subtype of type 'Function'“Null”类型不是“Function”类型的子类型
【发布时间】:2021-10-16 15:08:21
【问题描述】:

我是 Flutter 的新手。我正在构建一个测验应用程序并具有以下三个 dart 文件:

ma​​in.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 上运行应用程序时,出现此错误:

══╡ 小部件库发现异常╞══════════════════════════════════════ ═════
以下 _TypeError 在构建 MyApp(dirty, state: _MyAppState#7f7de):
“Null”类型不是“Function”类型的子类型
相关的导致错误的小部件是:
MyApp file:///C:/src/first_app/lib/main.dart:7:10

【问题讨论】:

  • @nvoigt 的回答看起来不错。只是一个建议,最好使用空安全版本。

标签: android flutter android-studio dart


【解决方案1】:

这个:

onPressed: () => buttonHandler,

需要是:

onPressed: buttonHandler,

onPressed: () => buttonHandler(),

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

另外,这个:

return Answer(_answerQuestion(),answer);

需要

return Answer(_answerQuestion,answer);

一般来说,您已经将调用一个方法和将一个方法作为参数传递混为一谈了,你可能想更加熟悉它。 p>

【讨论】:

    【解决方案2】:

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

    你在下面声明了这个函数:

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

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

    return Answer(_answerQuestion(),answer);
    

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

    return Answer(_answerQuestion,answer);
    

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

    onPressed: buttonHandler
    

    onPressed: () => buttonHandler()
    

    【讨论】:

    • 快乐 :) @ZabihUllah
    【解决方案3】:

    你的代码运行良好,试试flutter clean

    【讨论】:

    • 它不起作用。修复了上面两个答案中提到的问题
    猜你喜欢
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 2023-01-26
    • 2022-11-29
    • 1970-01-01
    相关资源
    最近更新 更多