【问题标题】:Read nested widget/class properties value in flutter在颤动中读取嵌套的小部件/类属性值
【发布时间】:2021-11-23 17:07:24
【问题描述】:

我正在构建一个简单的应用程序,其中包含来自不同专业文件的大量嵌套小部件/类

文件列表:

main.dart -> 用于启动活动的菜单文件 “活动()”

group_widgets.dart -> 包含自定义小部件的文件 "自定义小部件()"

file_a.dart -> 使用自定义小部件的文件 在“Activity()”中

other.dart -> 其他需要管理在CustomWidget()中更改的数据的文件

在 main.dart 中:

onPressed: () {
 Navigator.push(
  context,
  MaterialPageRoute(
   builder: (context) => const Activity(),
 ));
},

在 group_widgets.dart 中:

class CustomWidget extends StatefulWidget {
  const CustomWidget({Key? key}) : super(key: key);

  @override
  State<CustomWidget> createState() => _CustomWidgetState();
}

class _CustomWidgetState extends State<CustomWidget> {
  var _boolean = false;
  bool switchBoolean(bool state) => !state;

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: () => {
        setState(() {
          _boolean = switchBoolean(_boolean);
        })
      },
      child: Container(
        color: _boolean == true ? Colors.green : Colors.red,
      ),
    );
  }
}

file_a.dart 内部

class Activity extends StatefulWidget {
  const Activity({Key? key}) : super(key: key);

  @override
  State<Activity> createState() => _ActivityState();
}

class _ActivityState extends State<Activity> {
  @override
  Widget build(BuildContext context) {

    bool boolean = true;

    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: const [
            CustomWidget(),
            Text('Here where to show the variable from CustomWidget'
                'and prove I can retrieve it')
          ],
        ),
      ),
    );
  }
}

在 other.dart 中

if ( booleanFromCustomWidget == true) {
  Something ...
}

实现它的最佳做法是什么? 我在这里读了很多书,但似乎没有什么能很好地满足我的需要。

如果我的要求不像我认为的那么清楚,请发表评论))

【问题讨论】:

  • 看看我的回答,如果我的假设是正确的,你几乎可以删除代码并写一个视图文本行来表达意思:)

标签: flutter dart key


【解决方案1】:

如果我错了,请纠正我,但如果您想从其后代(子级甚至嵌套的子级)内部访问父小部件的数据,您可以通过参数参数传递它们:

 Child(int age, String name);

然后通过它的构造函数在 Child 小部件所在的新文件中接受它:

class Child {
  String name;
  int age;
     
  // Constructor
  Child(String passedName, int passedAge) {
    this.name = passedName;
    this.age = passedAge;
  }
}

在 parent.dart 中,您必须导入 children.dart 才能使用它。

或者使用流行的包,比如提供者包:https://pub.dev/packages/provider 这允许您存储数据容器,您基本上可以在代码中的任何位置访问这些容器。随意谷歌它并观看一些教程开始,因为它是避免将数据传递给真正不关心传递参数的小部件的首选方法。

注意:您可以像上面的示例代码一样转换想法以输出字符串数据。

【讨论】:

  • 对不起,这似乎不符合我的需要,我需要做的只是观察另一个类中自主工作的开关的状态,然后让一些外部逻辑工作。但可能“提供者”会起作用,我必须找到更好的方法))
  • 是的,这听起来像是提供者的一个很好的用例 - 最后它只是一个状态管理解决方案(例如切换/切换的东西) - 但要获得合适的答案,你必须更精确在你的问题中;)
【解决方案2】:

您可以使用状态管理器,例如提供程序或 bloc 在顶层,您设置数据服务

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 2020-09-10
  • 2020-08-06
  • 1970-01-01
  • 1970-01-01
  • 2019-11-02
  • 2022-08-13
  • 1970-01-01
  • 2018-01-10
  • 1970-01-01
相关资源
最近更新 更多