0

我有一个 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 按钮时读取子小部件中的数据。

谢谢。

4

1 回答 1

1

您可以使用 provider 在父窗口小部件中获取数据

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

关于 ChildWidget 的使用

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

并且MyModel()可以是包含要在 parent 中获取的数据的数据类appBar

现在在 Steam Builder 中,您可以使用

data.childData=newData

之后使用

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

在父小部件和

data.childData

会有newdata你想要的。

于 2020-05-26T00:37:35.397 回答