如何通过Flutter Provider创建和更新动态窗口小部件的值

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

所以我正在实现类似以下的内容:

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值,但是,即使更新了提供程序的值,文本小部件上显示的“ Count”也没有更新。

我想向您寻求帮助,以我的理解,只要值更改,事情就应该更新,这是Provider反模式,我是否必须重建整个ListView,或者错过了什么其他吗?

我仍然让我熟悉此程序包和飞镖/颤振器,希望您可以在此分享我的专业知识。预先非常感谢。

flutter dart flutter-provider
1个回答
0
投票

所以昨晚和今天早晨,我进行了大量研究,并进行了大量试验和错误,而我偶然偶然遇到了一个可行的想法!

您只需要将侦听值放在消费者小部件上,以确保它侦听我们已经在小部件树中实现更高的最近提供者。 (考虑到我已经完成了在FutureProvider小部件下面绘制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作为无状态小部件以供重用。尽管请确保已将引用的Button订阅到具有Counter值的同一个父提供程序,并且具有onTap属性,但它通过Provider <>。of

调用增量()函数。

希望这对以后的所有人有帮助!

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