在Flutter中,当子部件的构建方法中没有回调时,我如何从子部件中读取数据?

问题描述 投票:0回答:1

我有一个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的构建方法中设置了States。我的streambuilder内肯定有数据,因为这在其他地方使用,目前没有问题。

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

谢谢,我有一个AppBar按钮,在这个按钮上我可以读取数据。

flutter widget parent-child flutter-widget flutter-state
1个回答
1
投票

你可以使用provider来获取父部件中的数据。

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 你想。

© www.soinside.com 2019 - 2024. All rights reserved.