我是新手,我正在通过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,
)
使我的代码简短明了。但是,我也意识到了代码中的其他内容。我的应用程序中有三个条件,您可以猜到这三个条件是体重过轻,正常和超重。当我计算结果时,应用程序仅在超重时显示resultText
和interpretation
。如果结果为正常或体重不足,则不会显示它们,我认为这是导致我的应用崩溃的原因,因为它某种程度上无法获得为正常和体重不足分配的文本字符串。
答案 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
属性是从类成员:resultText
,bmiResult
,interpretation
初始化的。这些成员之一似乎是null
。为了避免red screen
,您需要:
ResultsPage(
resultText: 'Result Text',
bmiResult: 'BMI result',
interpretation: 'interpretation',
)
ResultsPage
的属性设置默认值(例如,空字符串)ResultsPage({this.resultText = '', this.bmiResult = '', this.interpretation = ''})
Text()
小部件中使用了解空值的功能:Text(resultText ?? 'n/a'),
这意味着文本data
如果等于不是 resultText
,则等于null
的值;如果,则等于n/a
是 null
。
空字符串将用作数据。