Flutter 组件回调

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flutter 组件回调相关的知识,希望对你有一定的参考价值。

参考技术A 在网上找了很多没有关于这方面的例子,组件之间传值,可以通过构建函数,如果我要回调这个组件的值呢,给大家介绍一下这两个值 ValueChanged VoidCallback 自己也加深记忆一下

一ValueChanged

官方解释

这个值可以回调值,例如

二 VoidCallback 

这个值也可以回调但不能回调值,只能触发方法

hao(()

print("");

);

hao(VoidCallback voidCallback)

voidCallback();



错误方法下面会报错的

在 Flutter 中,当子组件的 build 方法中没有回调时,如何从子组件中读取数据?

【中文标题】在 Flutter 中,当子组件的 build 方法中没有回调时,如何从子组件中读取数据?【英文标题】:In Flutter, how can I read data from a child widget when callbacks are not available within the build method of the child? 【发布时间】:2020-09-12 16:02:47 【问题描述】:

我有一个 AppBar 按钮,我想在其中读取 childData 列表并对其进行处理:

class _ParentState extends State<Parent> 
....
Widget build(BuildContext context) 
    return Scaffold(
        appBar: AppBar(
          actions: <Widget>[
              IconButton(icon: Icon(Icons.add),
              onPressed: () async 
                    //Need to access childData data here                   
                    print(childData); //currently prints null
                    ,
                  ),
              ],
        ),
        body: SafeArea(
          child: Column(
            children: <Widget>[
              ChildWidget(),
            ],

ChildWidget 使用 StreamBuilder 并循环遍历快照并在将快照附加到列表之前执行其他操作:

class ChildWidgetState extends State<ChildWidget> 
....
Widget build(BuildContext context) 
    return StreamBuilder<List<DocumentSnapshot>>(
        stream: stream,
        builder: (context, snapshots) 
              if (snapshots.connectionState == ConnectionState.active &&
                  snapshots.hasData) 
                      List<DocumentSnapshot> childData = [];
                      for (var x in snapshots.data) 
                          //do something else with snapshot data
                          childData.add(x);
                       

我尝试使用回调函数通知父小部件进行刷新,但这会产生setState() or markNeedsBuild() called during build 错误,因为它在 ChildWidget 的构建方法期间设置状态。我的流构建器中肯定有数据,因为它在其他地方使用,目前没有问题。

像 Provider 这样的状态管理包似乎只向子小部件提供数据,而不是将它们传回,而且我读过使用全局变量是不受欢迎的。将 childData 列表添加到 Hive 之类的数据库包中,然后在我的 ParentWidget 中读取它也是不好的做法吗?我不一定要重建父小部件 - 只需在单击 AppBar 按钮时读取子小部件中的数据。

谢谢。

【问题讨论】:

【参考方案1】:

你可以使用provider来获取父widget中的数据

Provider(
  create: (_) => MyModel(),
  child: ParentWidget()
)

关于 ChildWidget 的使用

data=Provider.of<MyModel>(context);

MyModel() 可以是数据类,其中包含您希望在父级appBar 中获取的数据。

现在可以在 Steam Builder 中使用

data.childData=newData

然后使用

data=Provider.of<MyModel>(context);

在父小部件和

data.childData

会有你想要的newdata

【讨论】:

使用 data=Provider.of(context,listen:false);所以父小部件在数据更改后不会重建

以上是关于Flutter 组件回调的主要内容,如果未能解决你的问题,请参考以下文章

Flutter学习组件通信(父子兄弟)

Flutter 拖拽排序组件 ReorderableListView

flutter 输入框组件封装

[Flutter插件开发] 网络状态监听组件

Flutter 功能型组件:WillPopScope

Flutter 之 输入框TextField