必须为文本窗口小部件提供非空字符串-flutter

时间:2020-11-01 07:13:42

标签: flutter dart

我是新手,我正在通过Udemy上的一门课程来学习它,在本课程中,我们学习了如何创建一个简单的BMI计算器,但问题是我的应用程序统计信息运行正常,我可以更改数字和性别,有时它会显示结果

<════════小部件库caught捕获了异常

构建了ResultsPage(dirty)时引发了以下断言:

必须将非空字符串提供给“文本”小部件。

“ package:flutter / src / widgets / text.dart”:

断言失败:第381行pos 10:“ data!= null”

相关的引起错误的小部件是:

结果页 文件:/// D:/FlutterProjects/bmi_calculator/lib/input_page.dart:223:47

引发异常时,这是堆栈:

#2新文本(package:flutter / src / widgets / text.dart:381:10)

#3 ResultsPage.build(软件包:bmi_calculator / results_page.dart:50:19)

#4 StatelessElement.build(package:flutter / src / widgets / framework.dart:4749:28)

#5 ComponentElement.performRebuild(程序包:flutter / src / widgets / framework.dart:4675:15)

#6 Element.rebuild(package:flutter / src / widgets / framework.dart:4369:5)>

我不知道到底是什么问题,我试图在这里阅读类似的问题,但是不幸的是,我找不到空的文本控件。这是我的结果页的代码

import 'package:bmi_calculator/bottom_button.dart';
import 'package:bmi_calculator/constants.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'reusable_card.dart';

class ResultsPage extends StatelessWidget {
  ResultsPage(
      {@required this.resultText,
      @required this.bmiResult,
      @required this.interpretation});

  final String resultText;
  final String bmiResult;
  final String interpretation;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Your Results'),
      ),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        crossAxisAlignment: CrossAxisAlignment.stretch,
        children: <Widget>[
          Expanded(
            child: Container(
              padding: EdgeInsets.all(15.0),
              alignment: Alignment.bottomLeft,
              child: Text(
                'Your Results',
                style: kTitleStyle,
              ),
            ),
          ),
          Expanded(
            flex: 5,
            child: ReusableCard(
              colour: kActiveCardColour,
              cardChild: Column(
                mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                crossAxisAlignment: CrossAxisAlignment.center,
                children: <Widget>[
                  Text(
                    bmiResult,
                    style: kResultTextStyle,
                  ),
                  Text(
                    resultText,
                    style: kNumberTextStyle.copyWith(
                      fontSize: 100.0,
                      fontWeight: FontWeight.bold,
                    ),
                  ),
                  Text(
                    interpretation,
                    textAlign: TextAlign.center,
                    style: kBMIResultTextStyle,
                  )
                ],
              ),
            ),
          ),
          BottomButton(
              onTap: () => Navigator.pop(context), buttonTitle: 'ReCalculate')
        ],
      ),
    );
  }
}

编辑: 谢谢大家对我的问题的答复。 所有解决方案都对我有用,并阻止了我的应用崩溃。而我使用了这种方法

          Text(
            bmiResult ?? '',
            style: kResultTextStyle,
          ),
          Text(
            resultText ?? '',
            style: kNumberTextStyle.copyWith(
              fontSize: 100.0,
              fontWeight: FontWeight.bold,
            ),
          ),
          Text(
            interpretation ?? '',
            textAlign: TextAlign.center,
            style: kBMIResultTextStyle,
          )

使我的代码简短明了。但是,我也意识到了代码中的其他内容。我的应用程序中有三个条件,您可以猜到这三个条件是体重过轻,正常和超重。当我计算结果时,应用程序仅在超重时显示resultTextinterpretation。如果结果为正常或体重不足,则不会显示它们,我认为这是导致我的应用崩溃的原因,因为它某种程度上无法获得为正常和体重不足分配的文本字符串。

3 个答案:

答案 0 :(得分:0)

要么将值初始化为非null,要么简单地使用???运算符,当检测到null时将其设为空字符串

myString = 'I contain foooour O's in a row without any space'

答案 1 :(得分:0)

您只需要检查您的变量:resultText,bmiResult,解释是否不为空,因为Text小部件无法接收空值。

                  Text(
                    this.bmiResult != null ? this.bmiResult : "",
                    style: kResultTextStyle,
                  ),
                  Text(
                    this.resultText != null ? this.resultText : "",
                    style: kNumberTextStyle.copyWith(
                      fontSize: 100.0,
                      fontWeight: FontWeight.bold,
                    ),
                  ),
                  Text(
                    this.interpretation != null ? this.interpretation : "",
                    textAlign: TextAlign.center,
                    style: kBMIResultTextStyle,
                  )

或者,您可以只使用null-coalescing运算符??简化:

this.interpretation ?? ""

答案 2 :(得分:0)

您至少有3个Text小部件,其中data属性是从类成员:resultTextbmiResultinterpretation初始化的。这些成员之一似乎是null。为了避免red screen,您需要:

  1. 调用带有初始化道具的小部件:
ResultsPage(
  resultText: 'Result Text',
  bmiResult: 'BMI result',
  interpretation: 'interpretation',
)
  1. 在构造函数中为ResultsPage的属性设置默认值(例如,空字符串)
ResultsPage({this.resultText = '', this.bmiResult = '', this.interpretation = ''})
  1. Text()小部件中使用了解空值的功能:
Text(resultText ?? 'n/a'),

这意味着文本data如果等于不是 resultText,则等于null的值;如果,则等于n/a null。 空字符串将用作数据。