flutter - SetState 不更新文本小部件中的变量
问题描述
我在尝试创建有状态计算器小部件时遇到问题(BMIState);调用 calculate() 方法后,我无法看到计算结果。
预期的行为是调用result.toString()
, 的 Text 小部件将根据来自两个文本控制器的输入显示计算结果。
但是,即使在调用calculate()
并更改result
using的值之后setState()
,Text 小部件仍将“result”作为其初始化值(即null
)的 toString 返回。
import 'package:flutter/material.dart';
class BMIPage extends StatefulWidget {
@override
State<StatefulWidget> createState() => BMIState();
}
class BMIState extends State {
TextEditingController mController = TextEditingController();
TextEditingController kgController = TextEditingController();
double result = 0;
@override
Widget build(BuildContext context) {
return Scaffold(
child: ListView(
children: <Widget>[
Column(
children: <Widget>[
TextField(
controller: mController,
keyboardType: TextInputType.number,
),
),
child: TextField(
controller: kgController,
keyboardType: TextInputType.number,),
),
FlatButton(
onPressed: () {
calculate();
},
),
Column(
children: <Widget>[
Text(
"BMI",
style: TextStyle(
fontSize: 40, fontWeight: FontWeight.w600, color: Colors.orangeAccent),
),
Text(
result.toString(),
style: TextStyle(
fontSize: 40, fontWeight: FontWeight.bold),
),
],
),
],
],
)));
}
void calculate() {
double height = double.tryParse(mController.text);
double weight = double.tryParse(kgController.text);
setState(() {
result = weight ~/ height * height;
});
}
}
解决方案
您可以在第 1 步下面复制粘贴运行完整代码
:您需要使用class BMIState extends State<BMIPage> {
notclass BMIState extends State {
第2步:Scaffold
body
不是child
工作演示
完整代码
import 'package:flutter/material.dart';
class BMIPage extends StatefulWidget {
@override
BMIState createState() => BMIState();
}
class BMIState extends State<BMIPage> {
TextEditingController mController = TextEditingController();
TextEditingController kgController = TextEditingController();
double result = 0;
@override
Widget build(BuildContext context) {
return Scaffold(
body: ListView(children: <Widget>[
Column(
children: <Widget>[
TextField(
controller: mController,
keyboardType: TextInputType.number,
),
TextField(
controller: kgController,
keyboardType: TextInputType.number,
),
FlatButton(
child: Text("calculate"),
onPressed: () {
calculate();
},
),
Column(
children: <Widget>[
Text(
"BMI",
style: TextStyle(
fontSize: 40,
fontWeight: FontWeight.w600,
color: Colors.orangeAccent),
),
Text(
result.toString(),
style: TextStyle(fontSize: 40, fontWeight: FontWeight.bold),
),
],
),
],
)
]));
}
void calculate() {
double height = double.tryParse(mController.text);
double weight = double.tryParse(kgController.text);
print(mController.text);
print(kgController.text);
setState(() {
result = weight ~/ height * height;
});
print(result);
}
}
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: BMIPage(),
);
}
}
推荐阅读
- typescript - 如何在 Async/await 中转换函数?
- python - 为什么 `tf.pad` 填充参数需要额外的增量以提高准确性?
- laravel - laravel 5.7 whereNull
- python - IndexError:弹出索引超出范围
- php - 即使声明了未定义的索引
- unity3d - 如何在单击按钮之前暂停所有脚本?
- c# - 如何截取最顶部窗口后面的窗口的屏幕截图?
- c++ - std::async lambda 函数中局部变量的生命周期
- angular - Angular Material Slider - 如何始终显示带有值和自定义的刻度间隔?
- google-cloud-platform - 为什么 GCSfuse 看不到 GS 存储桶,而 GSutil 可以?