是否有其他方法可以在提供程序 Flutter 中更新自定义列表视图中的数据

Posted

技术标签:

【中文标题】是否有其他方法可以在提供程序 Flutter 中更新自定义列表视图中的数据【英文标题】:Is there other method to update data in custom listview in provider Flutter 【发布时间】:2020-11-09 16:13:48 【问题描述】:

我正在从 firebase 获取数据并显示在列表视图中。我将数据存储在列表中,然后通知它,但列表长度仍然为空。 我研究了所有相关问题,但仍未得到解决方案。

每当我在 firebase 中添加一些新数据时,我都希望它同时出现在 listview 中。因此,我在这里使用提供者。也请给我一些想法。

提前谢谢你

这是代码

      class Home121 extends StatefulWidget 
        @override
        _Home121State createState() => _Home121State();
      

      final fb = FirebaseDatabase.instance.reference().child("Data");

      
      @override
      Widget build(BuildContext context) 

        Future<void> StoreData() async 
          dynamic key=CreateCryptoRandomString(32);
          fb.child(key).set(
            "id": key,
            "link": "EasyCoding",
          ).then((value) 
            ShowToastNow();
          );
        
        return ChangeNotifierProvider<TaskManager>(
            create: (context) => TaskManager(),
            child: Scaffold(
              appBar: AppBar(
                title: Text("Kkkk"),
              ),
              body: Container(
                  margin: EdgeInsets.all(
                    8,
                  ),
                  child: Consumer<TaskManager>(
                      builder: (context, myModel, child) 
                        return myModel.list.length==0? Text("zero"):ListView.builder(
                          itemCount:myModel.list.length,
                          itemBuilder: (context,index)
                            return Text(
                              myModel.list[index].Name,
                              style: TextStyle(
                                fontSize: 20,
                              ),
                            );
                          ,
                        );
                      

                  )
              ),
            )
        );

      
      @override
      void initState() 
        TaskManager task=TaskManager();
        task.GetData();
      
      


      class TaskManager extends ChangeNotifier

        List<Model> list=new List();
        GetData()
          //get data here
        

        AddNewTask()
          // add data to databse
          list.add(model);
          notifyListeners();
        
      

编辑:

      class MyClass extends StatelessWidget 
        @override
        Widget build(BuildContext context) 
          return ChangeNotifierProvider<TaskManager>(
              create: (context) => TaskManager(),
              child: Home121());
        
      

【问题讨论】:

【参考方案1】:

这是因为在initState() 中,您正在创建TaskManager 的另一个实例并在该实例上调用GetData() 方法。

因此Consumer 小部件使用的TaskManager 实例不同,因此其中的列表始终为空。

相反,您需要在 initState().. 中执行此操作。

void initState() 
    TaskManager task = Provider.of<TaskManager>(context);
    task.GetData();

通过这样做,您在 Consumer 小部件使用的同一实例上调用 GetData() 方法。

【讨论】:

谢谢先生,但现在它给出了太多错误,例如在此 Home121 小部件上方找不到正确的 Provider。这可能是因为您使用了不包括您选择的提供程序 I/flutter (14535): 的 BuildContext。有几种常见的情况: 为此,您需要从build() 方法中删除ChangeNotifierProvider&lt;TaskManager&gt;,并用ChangeNotifierProvider&lt;TaskManager&gt; 包裹Home121() 小部件。 仍然报错:在 _Home121State.initState() 完成之前调用了dependOnInheritedElement()。 您能否编辑问题以包括您如何对代码进行最后一次更改? 不确定,但您可以删除它并尝试用ChangeNotifierProvider&lt;TaskManager&gt; 包裹MaterialApp() 吗?

以上是关于是否有其他方法可以在提供程序 Flutter 中更新自定义列表视图中的数据的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 1.5 中更改组的应用程序标签

抽象类是否可以具有其他抽象类的返回类型的方法?

满足 'firebase_admob' 的规范,但它们需要 Flutter 中更高的最小部署目标

有啥方法可以将提供者依赖注入到 Flutter 中的普通类中?

是否可以在 Flutter 中使用 remove.bg API 开发应用程序?

在用户空间中编写文件系统驱动程序是不是比在内核空间中更容易?