【问题标题】:Class is returning null instead of the string property assigned to its constructor?类返回 null 而不是分配给其构造函数的字符串属性?
【发布时间】:2020-07-03 01:50:41
【问题描述】:

我正在通过在线课程学习 Flutter。我正在上课。所以我们必须创建一个具有stringbool 属性的类。下面是这个类:

 class Question{
  String questionText;
  bool questionAnswer;

  Question({String q, bool a}){
    q = questionText;
    a = questionAnswer;
  }
}

然后我在main.dart 中创建这些类的列表,并将值分配给它们的构造函数:

List<Question> questionsAnswers = [
    Question(q:'You can lead a cow down stairs but not up stairs.', a:false),
    Question(q:'Approximately one quarter of human bones are in the feet.', a:true),
    Question(q:'A slug\'s blood is green.', a:true),
  ];

然后尝试从上述列表中获取值到Text 小部件:

Text(
                questionsAnswers[questionNumber].questionText,
                textAlign: TextAlign.center,
                style: TextStyle(
                  fontSize: 25.0,
                  color: Colors.white,
                ),
              ),

其中questionNumber 是一个递增的整数,当前为0。

但这不能编译,我得到错误:

在构建 QuizPage(dirty, state: _QuizPageState#558aa):必须向文本小部件提供非空字符串。 'package:flutter/src/widgets/text.dart':断言失败: 第 298 行第 10 行:“数据!= null”

它肯定返回null 而不是分配给它的字符串。当我将有问题的行更改为questionsAnswers[questionNumber].questionText.toString(), 时,屏幕上会打印出null

为什么获取不到字符串值?

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    Question 构造函数中实例变量的赋值是向后的。构造函数应该是

    class Question {
      String questionText;
      bool questionAnswer;
    
      Question({String q, bool a}) {
        questionText = q;
        questionAnswer = a;
      }
    }
    

    Dart Language Tour 在此处有一些实例变量初始化的示例:https://dart.dev/guides/language/language-tour#constructors

    这是一支带有工作示例的笔:https://codepen.io/ezrayoung/pen/ExPobMB

    【讨论】:

      【解决方案2】:

      尝试做:

          class Question{
        String questionText;
        bool questionAnswer;
      
        Question({String q, bool a}){
          questionText =q;
          questionAnswer =a;
        }
      }
      

      【讨论】:

      • 是对的,但描述错误的来源更有帮助,以便其他人将来避免。在示例中,错误是构造函数如何分配字段值。 Dart 将表达式的右侧分配给左侧变量。所以构造函数语法是:q = questionText; a = questionAnswer; 因为 q 和 a 是构造函数调用中的参数,而不是类字段保持为空。正确的声明是:questionText = q; questionAnswer = a;
      【解决方案3】:

      @darkness 答案解决了您的问题。但是,我觉得让你的参数是单词而不是单个字符会增加其他编码人员的可读性。我已更改您的变量以获得更好的可读性

      class Question {
            Question({this.text, this.answer});
            final String text;
            final bool answer;
          }
      
      
      List<Question> questions = [
          Question(text:'You can lead a cow down stairs but not up stairs.', answer: false),
        ];
      
      print(questions.first.text)
      print(questions.first.answer)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-07
        • 1970-01-01
        • 2014-07-28
        • 2019-09-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多