Flutter 如何在flatter中将设置状态值的更改从父窗口小部件传递到子窗口小部件?
我已经声明了一个int'k',我正在使用set state函数从用户的输入更改它的值。k值的变化反映在营养功能上。但当把“k”的值传递给checkbbox函数时,它总是2(初始值) 基本上,即使营养小部件正在重建,设置状态更改也不会传递给复选框Flutter 如何在flatter中将设置状态值的更改从父窗口小部件传递到子窗口小部件?,flutter,Flutter,我已经声明了一个int'k',我正在使用set state函数从用户的输入更改它的值。k值的变化反映在营养功能上。但当把“k”的值传递给checkbbox函数时,它总是2(初始值) 基本上,即使营养小部件正在重建,设置状态更改也不会传递给复选框 class Nutrition extends StatefulWidget { @override _Nutrition createState() => _Nutrition(); }
class Nutrition extends StatefulWidget {
@override
_Nutrition createState() => _Nutrition();
}
class _Nutrition extends State<Nutrition> {
DateTime now = DateTime.now().toLocal();
int k = 2;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('CqMyOE via Nutrition'),
),
body: SingleChildScrollView(
child: Container(
color: Colors.grey[200],
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
FlatButton(
onPressed: () {
setState(() {
k = 0;
});
},
child: Text(
DateFormat('dd-MMM').format(now),
),
color: (k == 0) ? Colors.greenAccent : Colors.grey,
),
FlatButton(
onPressed: () {
setState(() {
k = 1;
});
},
child: Text(
DateFormat('dd-MMM')
.format(now.subtract(new Duration(days: 1))),
),
color: (k == 1) ? Colors.greenAccent : Colors.grey,
),
FlatButton(
onPressed: () {
setState(() {
k = 2;
});
},
child: Text(
DateFormat('dd-MMM')
.format(now.subtract(new Duration(days: 2))),
),
color: (k == 2) ? Colors.greenAccent : Colors.grey,
),
FlatButton(
onPressed: () {
setState(() {
k = 3;
});
},
child: Text(
DateFormat('dd-MMM')
.format(now.subtract(new Duration(days: 3))),
),
color: (k == 3) ? Colors.greenAccent : Colors.grey,
),
],
),
Card(
child: Row(
children: [
Expanded(
flex: 1,
child: Padding(
padding: const EdgeInsets.fromLTRB(8, 16, 8, 16),
child: Text('Salt awareness' + k.toString()),
),
),
Expanded(
child: Row(
children: [
CheckBox(
10,
nutritionDB.get(curDate).record[10] ?? '0',
k,
),
],
),
),
],
),
),
]
)
)
)
)
}
class CheckBox extends StatefulWidget {
final int index;
final String value;
// final String date;
final int k;
CheckBox(this.index, this.value, this.k);
@override
State<StatefulWidget> createState() =>
_CheckBox(index, value == '1' ? true : false, k);
}
class _CheckBox extends State<CheckBox> {
int index;
bool checked;
// String date;
int k;
_CheckBox(this.index, this.checked, this.k);
@override
Widget build(BuildContext context) {
return IconButton(
icon: Icon(
checked ? Icons.check : Icons.clear,
),
color: checked ? Colors.green : Colors.red,
onPressed: () {
final nutritionDB = Hive.box<NutritionData>('NutritionDB');
List<String> temp = nutritionDB.get(day3).record;
temp[index] = !checked ? '1' : '0';
NutritionData temp1 = new NutritionData(temp);
nutritionDB.put(day3, temp1);
setState(() {
print(k);
checked = !checked;
});
},
);
}
}
类营养扩展StatefulWidget{
@凌驾
_营养品createState()=>U营养品();
}
国家级{
DateTime now=DateTime.now().toLocal();
int k=2;
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“通过营养实现的CqMyOE”),
),
正文:SingleChildScrollView(
子:容器(
颜色:颜色。灰色[200],
子:列(
mainAxisAlignment:mainAxisAlignment.start,
儿童:[
划船(
mainAxisAlignment:mainAxisAlignment.spaceAround,
儿童:[
扁平按钮(
已按下:(){
设置状态(){
k=0;
});
},
子:文本(
DateFormat('dd-MMM')。格式(现在),
),
颜色:(k==0)?颜色。绿色强调:颜色。灰色,
),
扁平按钮(
已按下:(){
设置状态(){
k=1;
});
},
子:文本(
日期格式('dd-MMM')
.format(现在是.subtract(新的持续时间(天:1)),
),
颜色:(k==1)?颜色。绿色强调:颜色。灰色,
),
扁平按钮(
已按下:(){
设置状态(){
k=2;
});
},
子:文本(
日期格式('dd-MMM')
.format(现在是.subtract(新的持续时间(天:2)),
),
颜色:(k==2)?颜色。绿色强调:颜色。灰色,
),
扁平按钮(
已按下:(){
设置状态(){
k=3;
});
},
子:文本(
日期格式('dd-MMM')
.format(现在是.subtract(新的持续时间(天:3)),
),
颜色:(k==3)?颜色。绿色强调:颜色。灰色,
),
],
),
卡片(
孩子:排(
儿童:[
扩大(
弹性:1,
孩子:填充(
填充:从LTRB(8,16,8,16)开始的常数边集,
child:Text('Salt aware'+k.toString()),
),
),
扩大(
孩子:排(
儿童:[
复选框(
10,
nutritionDB.get(curDate).record[10]??“0”,
K
),
],
),
),
],
),
),
]
)
)
)
)
}
类复选框扩展StatefulWidget{
最终整数指数;
最终字符串值;
//最终字符串日期;
最终int k;
复选框(this.index、this.value、this.k);
@凌驾
状态createState()=>
_复选框(索引,值='1'?真:假,k);
}
类_复选框扩展状态{
整数指数;
布尔检查;
//字符串日期;
int k;
_复选框(this.index,this.checked,this.k);
@凌驾
小部件构建(构建上下文){
返回图标按钮(
图标:图标(
选中?图标。选中:图标。清除,
),
颜色:选中?颜色。绿色:颜色。红色,
已按下:(){
final nutritionDB=蜂箱盒(“nutritionDB”);
列表温度=B.get(第3天)。记录;
临时[索引]=!已选中?'1':'0';
NutritionData temp1=新的NutritionData(temp);
营养素b.put(第3天,临时1);
设置状态(){
印刷品(k);
选中=!选中;
});
},
);
}
}
您可以复制粘贴运行下面的完整代码为了演示,我在图标按钮之前添加了
k
值
您可以在diddupdatewidget
resetk=widget.k;
代码片段
class _CheckBox extends State<CheckBox> {
...
@override
void didUpdateWidget(covariant CheckBox oldWidget) {
if (oldWidget.k != widget.k) {
k = widget.k;
}
super.didUpdateWidget(oldWidget);
}
class\u复选框扩展状态{
...
@凌驾
void didUpdateWidget(协变复选框oldWidget){
if(oldWidget.k!=widget.k){
k=widget.k;
}
super.didUpdateWidget(oldWidget);
}
工作演示
完整代码
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
class Nutrition extends StatefulWidget {
@override
_Nutrition createState() => _Nutrition();
}
class _Nutrition extends State<Nutrition> {
DateTime now = DateTime.now().toLocal();
int k = 2;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('CqMyOE via Nutrition'),
),
body: SingleChildScrollView(
child: Container(
color: Colors.grey[200],
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
FlatButton(
onPressed: () {
setState(() {
k = 0;
});
},
child: Text(
DateFormat('dd-MMM').format(now),
),
color: (k == 0) ? Colors.greenAccent : Colors.grey,
),
FlatButton(
onPressed: () {
setState(() {
k = 1;
});
},
child: Text(
DateFormat('dd-MMM')
.format(now.subtract(new Duration(days: 1))),
),
color: (k == 1) ? Colors.greenAccent : Colors.grey,
),
FlatButton(
onPressed: () {
setState(() {
k = 2;
});
},
child: Text(
DateFormat('dd-MMM')
.format(now.subtract(new Duration(days: 2))),
),
color: (k == 2) ? Colors.greenAccent : Colors.grey,
),
FlatButton(
onPressed: () {
setState(() {
k = 3;
});
},
child: Text(
DateFormat('dd-MMM')
.format(now.subtract(new Duration(days: 3))),
),
color: (k == 3) ? Colors.greenAccent : Colors.grey,
),
],
),
Card(
child: Row(
children: [
Expanded(
flex: 1,
child: Padding(
padding:
const EdgeInsets.fromLTRB(8, 16, 8, 16),
child: Text('Salt awareness' + k.toString()),
),
),
Expanded(
child: Row(
children: [
CheckBox(
10,
"nutritionDB.get(curDate).record[10]" ??
'0',
k,
),
],
),
),
],
),
),
]))));
}
}
class CheckBox extends StatefulWidget {
final int index;
final String value;
// final String date;
final int k;
CheckBox(this.index, this.value, this.k);
@override
State<StatefulWidget> createState() =>
_CheckBox(index, value == '1' ? true : false, k);
}
class _CheckBox extends State<CheckBox> {
int index;
bool checked;
// String date;
int k;
_CheckBox(this.index, this.checked, this.k);
@override
void didUpdateWidget(covariant CheckBox oldWidget) {
if (oldWidget.k != widget.k) {
k = widget.k;
}
super.didUpdateWidget(oldWidget);
}
@override
Widget build(BuildContext context) {
return Row(
children: [
Text("k $k"),
IconButton(
icon: Icon(
checked ? Icons.check : Icons.clear,
),
color: checked ? Colors.green : Colors.red,
onPressed: () {
//final nutritionDB = Hive.box<NutritionData>('NutritionDB');
//List<String> temp = nutritionDB.get(day3).record;
//temp[index] = !checked ? '1' : '0';
//NutritionData temp1 = new NutritionData(temp);
//nutritionDB.put(day3, temp1);
setState(() {
print(k);
checked = !checked;
});
},
),
],
);
}
}
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Nutrition(),
);
}
}
导入“包装:颤振/材料.省道”;
导入“包:intl/intl.dart”;
类扩展了StatefulWidget{
@凌驾
_营养品createState()=>U营养品();
}
国家级{
DateTime now=DateTime.now().toLocal();
int k=2;
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“通过营养实现的CqMyOE”),
),
正文:SingleChildScrollView(
子:容器(
颜色:颜色。灰色[200],
子:列(
mainAxisAlignment:mainAxisAlignment.start,
儿童:[
划船(
mainAxisAlignment:mainAxisAlignment.spaceAround,
儿童:[