我在更新变量时遇到问题,因为它也会影响其父变量.我试图从子项中删除列表项,但它也会删除父项数据.

这是我的密码

Future<void> ChangeSubCategory({required String value}) async {
    if (this.mounted) {
      setState(() {
        if (!_subCategory.contains(value)) {
          if (value == 'all') {
            _subCategory = _categoryOutput[_category]; => set _subCategory from parent List
          } else {
            _subCategory.add(value);
          }
        } else if (_subCategory.contains(value)) {
          _subCategory.remove(value); => When doing this one, the parent _categoryOutput also affected
        }
        UpdateFilter();
      });
    }
  }

如果我们想从父级复制变量,最安全的方法是什么?因为在flatter中,当我们更新子变量时,它也会更新父变量.非常感谢.

推荐答案

你的问题是更新所有子部件的父部件的整个状态,为了避免这种情况,你可以使用StatefulBuilder只更新你想要的子部件!

如下例所示,即使所有三个复选框都会更改变量isChecked,但只有第一个复选框可以刷新整个状态,这会刷新所有三个复选框,而第二个和第三个复选框只能在使用StatefulBuilder时刷新其状态:

class MyApp extends StatefulWidget {
  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  bool isChecked = false;
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
          appBar: AppBar(
            title: Text('Example'),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                Text('Refresh all the checkboxes'),
                Checkbox(
                  value: isChecked,
                  onChanged: (value) {
                    setState(() {
                      isChecked = !isChecked;
                    });
                  },
                ),
                Divider(),
                Text('Refresh only this checkbox'),
                StatefulBuilder(
                  builder: (context, setState) => Checkbox(
                    value: isChecked,
                    onChanged: (value) {
                      setState(() {
                        isChecked = !isChecked;
                      });
                    },
                  ),
                ),
                Divider(),
                Text('Refresh only this checkbox'),
                StatefulBuilder(
                  builder: (context, setState) => Checkbox(
                    value: isChecked,
                    onChanged: (value) {
                      setState(() {
                        isChecked = !isChecked;
                      });
                    },
                  ),
                ),
              ],
            ),
          )),
    );
  }
}

Flutter相关问答推荐

ListView内的ListView正在一次构建所有项目

我如何才能收到每天重复的预定通知?

在Flutter 中将参数从一个类传递到另一个类

如何在WidgetRef引用外部的函数中使用Riverpod刷新数据

Flutter -如何停止块监听程序在后台堆栈中运行

SupabaseFlutter 集成问题:无法更新行

使用持久的侧边菜单和顶部栏在Ffltter Web应用程序中的页面之间导航

Flutter Android Google Sign-in error:ApiException:10在确认软件包名称、SHA-1 fingerprint 和设置同意页面后出现异常

Flutter 构建 Web 分段故障 - 无法启动事件处理程序线程

Flutter 需要 Xcode 14 或更高版本

Flutter 中的区域不匹配

PreferredSizeWidget类不能用作混合,因为它既不是混合类也不是混合

输入处于活动状态时如何设置文本字段标签的样式?

Container 的 Flutter 背景图片不会出现

Flutter Dart 功能弹出错误的小部件?

Flutter可滚动定位列表支持rtl方向吗?

如何在两个不同的路由(屏幕)之间正确设置 BlocProvider?

如何将 chrome web 模拟器添加到 vs code

如何防止卡子在底部溢出?

如何在屏幕按钮中排列 row() (我想在按钮中放置屏幕导航图标)