【问题标题】:How to create and update the value of Dynamic Widgets through Flutter Provider如何通过 Flutter Provider 创建和更新 Dynamic Widgets 的值
【发布时间】:2020-06-01 14:04:59
【问题描述】:

所以我正在实现如下内容:

class TempProvider extends ChangeNotifier(){
    List<Widget> _list = <Widget>[];
    List<Widget get list => _list;
    int _count = 0;
    int get count => _count;

    Future<List<Widget>> getList() async{
        addToList(Text('$count'));

        List _result = await db....
        _result.forEach((_item){
            addToList(Button(
                onTap: () => increment();
                child: Text('Press'),
            ));
        });
    }

    addToList(Widget widget){
        _list.add(widget);
        notifyListeners();
    }

    increment(){
        _count += 1;
        notifyListeners();
    }
}

class Parent extends StatelessWidget{
    @override
    Widget build(BuildContext context) {
        return FutureProvider(
        create: (context) => TempProvider().getList(),
        child: Child(),
        );
    }   
}

class Child extends StatelessWidget{
    @override
    Widget build(BuildContext context) {
    var futureProvider = Provider.of<List<Widget>>(context);

        return Container(
        child: futureProvider == null 
            ? Text('Loading...'
            : ListView.builder(
                itemCount: futureProvider.length,
                itemBuilder: (BuildContext context, int index){
                    return futureProvider[index];
                }
            ),
        ));
    }   
}

基本上,它的作用是来自未来的小部件列表是我拥有的 ListView Builder 的内容,因为它的对象是从数据库查询生成的。这些小部件是按钮,按下时应更新“计数”值,并应更新显示最新“计数”值的文本小部件。

我能够测试按钮,它们似乎可以工作,并且正在通过后端增加 _count 值,但是,即使更新了提供程序值,文本小部件上显示的“计数”也不会更新。

我想请你帮忙看看这里出了什么问题,据我了解,只要值发生变化,事情就应该更新,这是提供者反模式,我是否必须重建整个 ListView,或者我错过了还有什么?

我仍然对这个包和 dart/flutter 大体上熟悉,希望你能与我分享你在这方面的专业知识。非常感谢您。

【问题讨论】:

    标签: flutter dart flutter-provider


    【解决方案1】:

    所以昨晚和今天早上我进行了大量研究和反复试验,我只是不小心碰到了一个可行的想法!

    您只需将监听值放在消费者小部件上,确保它监听我们已经在小部件树中实现的最近的提供者。 (考虑到我已经在 FutureProvider Widget 下方绘制了我的 ListView 构建器)

    ..getList() async{
        Consumer<ChallengeViewProvider>(
            builder: (_, foo, __) => Text(
                '${foo.count}',
            ),
        );
    
        List _result = await db....
        _result.forEach((_item){
            addToList(Button(
                onTap: () => increment();
                child: Text('Press'),
            ));
        });
    }
    

    我还重构了我的小部件并将 Button 作为无状态小部件取出以供重复使用。尽管确保引用的 Buttons 订阅了具有 Counter 值的同一个父提供程序,并让 onTap 属性通过 Provider.of

    调用 increment() 函数

    希望这对将来的任何人都有帮助!

    【讨论】:

      猜你喜欢
      • 2020-12-17
      • 1970-01-01
      • 1970-01-01
      • 2020-08-31
      • 2020-07-19
      • 2021-02-04
      • 2020-06-01
      • 2020-07-04
      • 2019-12-05
      相关资源
      最近更新 更多