Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 如何在flatter中将设置状态值的更改从父窗口小部件传递到子窗口小部件?_Flutter - Fatal编程技术网

Flutter 如何在flatter中将设置状态值的更改从父窗口小部件传递到子窗口小部件?

Flutter 如何在flatter中将设置状态值的更改从父窗口小部件传递到子窗口小部件?,flutter,Flutter,我已经声明了一个int'k',我正在使用set state函数从用户的输入更改它的值。k值的变化反映在营养功能上。但当把“k”的值传递给checkbbox函数时,它总是2(初始值) 基本上,即使营养小部件正在重建,设置状态更改也不会传递给复选框 class Nutrition extends StatefulWidget { @override _Nutrition createState() => _Nutrition(); }

我已经声明了一个int'k',我正在使用set state函数从用户的输入更改它的值。k值的变化反映在营养功能上。但当把“k”的值传递给checkbbox函数时,它总是2(初始值)

基本上,即使营养小部件正在重建,设置状态更改也不会传递给复选框

    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
reset
k=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,
儿童:[