【发布时间】:2021-12-25 05:43:45
【问题描述】:
代码应该可以在旧版本中正常工作,因为它是现成的解决方案,但我遇到了错误:
类型“Null”不是“函数结果”的“列表”类型的子类型
这是我的代码:
import 'package:first_flutter_project/shared/menu_bottom.dart';
import 'package:first_flutter_project/shared/menu_drawer.dart';
import 'package:flutter/material.dart';
class BmiScreen extends StatefulWidget {
const BmiScreen({Key? key}) : super(key: key);
@override
_BmiScreenState createState() => _BmiScreenState();
}
class _BmiScreenState extends State<BmiScreen> {
final double fontSize = 18;
final TextEditingController txtHeight = TextEditingController();
final TextEditingController txtWeight = TextEditingController();
String result = '';
bool isMetric = true;
bool isImperial = false;
double? height;
double? weight;
String heightMessage = '';
String weightMessage = '';
late List<bool> isSelected;
@override
void initState() {
isSelected = [isMetric, isImperial];
super.initState();
}
@override
Widget build(BuildContext context) {
heightMessage =
'Please insert your height in ' + ((isMetric) ? 'meters' : 'inches');
weightMessage =
'Please insert your weight in ' + ((isMetric) ? 'kilos' : 'pounds');
return Scaffold(
appBar: AppBar(
title: Text('BMI Calculator'),
),
drawer: MenuDrawer(),
bottomNavigationBar: MenuBottom(),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
ToggleButtons(
children: [
Padding(
padding: EdgeInsets.symmetric(horizontal: 16),
child: Text(
'Metric',
style: TextStyle(
fontSize: fontSize,
),
)),
Padding(
padding: EdgeInsets.symmetric(horizontal: 16),
child: Text(
'Imperial',
style: TextStyle(fontSize: fontSize),
)),
],
isSelected: isSelected,
onPressed: toggleMeasure,
),
TextField(
controller: txtHeight,
keyboardType: TextInputType.number,
decoration: InputDecoration(
hintText: heightMessage,
),
),
TextField(
controller: txtWeight,
keyboardType: TextInputType.number,
decoration: InputDecoration(hintText: weightMessage),
),
ElevatedButton(
onPressed: findBMI,
child: Text('Calculate BMI',
style: TextStyle(
fontSize: fontSize,
))),
Text(result,
style: TextStyle(
fontSize: fontSize,
))
],
),
),
);
}
void toggleMeasure(value) {
if (value == 0) {
isMetric = true;
isImperial = false;
} else {
isMetric = false;
isImperial = true;
}
setState(() {
isSelected = [isMetric, isImperial];
});
}
void findBMI() {
double bmi = 0;
double height = double.tryParse(txtHeight.text) ?? 0;
double weight = double.tryParse(txtWeight.text) ?? 0;
if (isMetric) {
bmi = weight / (height * height);
} else {
bmi = (weight * 703) / (height * height);
}
setState(() {
result = 'Your BMI is ' + bmi.toStringAsFixed(2);
});
}
}
这里是 StackTrace:
The relevant error-causing widget was:
BmiScreen BmiScreen:file:///C:/Users/San4o/AndroidStudioProjects/first_flutter_project/lib/main.dart:18:30
When the exception was thrown, this was the stack:
#0 _BmiScreenState.isSelected (package:first_flutter_project/screens/bmi_screen.dart)
#1 _BmiScreenState.build (package:first_flutter_project/screens/bmi_screen.dart:67:27)
#2 StatefulElement.build (package:flutter/src/widgets/framework.dart:4782:27)
#3 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4665:15)
#4 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4840:11)
#5 Element.rebuild (package:flutter/src/widgets/framework.dart:4355:5)
#6 StatefulElement.update (package:flutter/src/widgets/framework.dart:4872:5)
#7 Element.updateChild (package:flutter/src/widgets/framework.dart:3412:15)
我认为初始化字段可能存在一些问题:
late List<bool> isSelected;
我曾尝试将其更改为可为空,但随后出现错误:
lib/screens/bmi_screen.dart:67:27: Error: The argument type 'List<bool>?' can't be assigned to the parameter type 'List<bool>' because 'List<bool>?' is nullable and 'List<bool>' isn't.
- 'List' is from 'dart:core'.
isSelected: isSelected,
^
您能否建议,我该如何解决这个问题?任何帮助表示赞赏。
谢谢
【问题讨论】:
-
如果你在声明的时候进行初始化会不会起作用? List
isSelected= [isMetric, isImperial]; (或将其声明为 [] - 您可能更喜欢 const) -
@CetinBasoz 有趣的是,今天我没有出错,一切正常,没有做任何改变。诡异的。顺便说一句,List
isSelected = [];也可以正常工作,并且 List isSelected= [isMetric, isImperial];不是因为无法在初始化程序中访问实例成员“isMetric”