小部件库捕获的异常,在颤振中抛出以下断言构建答案**错误**

Posted

技术标签:

【中文标题】小部件库捕获的异常,在颤振中抛出以下断言构建答案**错误**【英文标题】:Exception caught by widgets library ,The following assertion was thrown building Answer **error** in flutter 【发布时间】:2021-07-24 21:01:20 【问题描述】:

我是 flutter 的新手,或者编程要清晰。我正在学习一门课程,与讲师做同样的事情,该应用程序为他工作,但是当我尝试运行它时,出现此错误。

// @dart=2.9

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



class Quiz extends StatelessWidget 
  final List<Map<String, Object>> questions;
  final int questionIndex;
  final Function answerQuestion;

  Quiz(
      @required this.questions,
      @required this.answerQuestion,
      @required this.questionIndex);

  @override
  Widget build(BuildContext context) 
    return ListView(
      children: [
        Question(
          questions[questionIndex]['questionText'],
        ),
        ...(questions[questionIndex]['answers'] as List<Map<String, Object>>)
            .map((answer) 
          return Answer(() => answerQuestion(answer['score']), answer['text']);
        ).toList()
      ],
    );
  

【问题讨论】:

【参考方案1】:

这意味着您的地图在某处有一个空值。将您的代码更改为:

Answer(() => answerQuestion(answer['score']??"NA"), answer['text']??"NA");

【讨论】:

也许你也需要为“问题”做这件事。基本上看看你的小部件,你有一个文本小部件,并确保你考虑了空值。【参考方案2】:

问题可能是课程中的人使用的是旧版本的 Flutter,它不使用 null safety。因此,要解决此问题,您需要将代码迁移到空安全。有关如何以及何时使用 null 安全性的更多信息,您可以参考这篇很棒的 video from Robert Brunehage。您需要对代码进行的修复如下:

1.@required改为required

2.为没有值的变量添加问号,

不好的例子:

int questionIndex;

这将导致空错误,因为name 没有值(意味着它为空)

正确示例

int? questionIndex;

这个变量现在是 null 安全的,可以防止它以错误结束。

3.在您现在将没有默认值 null 的变量设为安全之后,您必须在某些地方添加 !(您的 IDE 应该会告诉您正常添加它的位置)

代码错误:

questions[questionIndex]['questionText'],

正确代码

questions[questionIndex!]['questionText'],

如果您不想使用 Null 安全性(不推荐!)

如果你的变量没有值(为空),你可以给你的小部件一个默认文本

Question(questions[questionIndex]['questionText']?? "default value",),

【讨论】:

以上是关于小部件库捕获的异常,在颤振中抛出以下断言构建答案**错误**的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:找不到方向性小部件

NoSuchMethodError,小部件库捕获的异常

Objective-C 在静态库中抛出异常。如何使用该库从程序中捕获异常?

必须向 Text 小部件提供非空字符串 - 颤振

如何捕获ctypes中抛出的异常?

当结果 api 返回 null 或 /403/404/500/503 状态时,Flutter 在小部件中抛出消息