Flutter 如何在颤振提供程序中正确初始化未来

Flutter 如何在颤振提供程序中正确初始化未来,flutter,dart,flutter-provider,Flutter,Dart,Flutter Provider,因此,我正试图建立一个名单,在我的供应商从未来的电话 到目前为止,我有以下ChangeNotifier类: class MainProvider extends ChangeNotifier { List<dynamic> _list = <dynamic>[]; List<dynamic> get list => _list; int count = 0; MainProvider() { initList(); }

因此,我正试图建立一个名单,在我的供应商从未来的电话

到目前为止,我有以下ChangeNotifier类:

class MainProvider extends ChangeNotifier {
  List<dynamic> _list = <dynamic>[];
  List<dynamic> get list => _list;
  int count = 0;

  MainProvider() {
    initList();
  }

  initList() async {
    var db = new DatabaseHelper();

    addToList(Consumer<MainProvider>(
        builder: (_, provider, __) => Text(provider.count.toString())));

    await db.readFromDatabase(1).then((result) {
      result.forEach((item) {
        ModeItem _modelItem= ModeItem.map(item);

        addToList(_modelItem);
      });
    });
  }

  addToList(Object object) {
    _list.add(object);
    notifyListeners();
  }

  addCount() {
    count += 1;
    notifyListeners();
  }
}
class MainProvider扩展了ChangeNotifier{
列表_List=[];
列表获取列表=>\u列表;
整数计数=0;
MainProvider(){
initList();
}
initList()异步{
var db=new DatabaseHelper();
地址列表(消费者)(
生成器:(u,provider,u)=>Text(provider.count.toString());
等待db.readFromDatabase(1)。然后((结果){
结果。forEach((项目){
ModeItem _modelItem=ModeItem.map(项目);
addToList(_modelItem);
});
});
}
addToList(对象){
_列表。添加(对象);
notifyListeners();
}
addCount(){
计数+=1;
notifyListeners();
}
}
但是,每当我使用列表值时,就会发生这种情况:

  • 我可以确认initList函数是否正确执行
  • 列表中可用的初始内容是 Text()小部件,我首先通过addToList函数插入它,这意味着此时列表中似乎只有一项
  • 当我执行热重新加载时,列表的其余内容现在似乎出现了
  • 注:

  • 我在AnimatedList小部件中使用list的值,因此 应该显示列表的内容
  • 最初显示的是我的列表的内容值只有一项
  • “我的列表”值在更新过程中似乎不会自动更新 执行我未来的通话
  • 但是,当我尝试调用addCount函数时,它通常 更新计数的值,而无需执行热重新加载- 这个似乎功能正常
  • 未来调用似乎没有正确更新 我的列表的内容
  • 我真正关心的是,在初始加载时,我的列表值不存在 按预期正确初始化其所有值

    希望你们能在这件事上帮我。多谢各位

    更新:下面显示我如何使用上面的ChangeNotifierClass

    class ParentProvider extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MultiProvider(
          providers: [
            ChangeNotifierProvider<MainProvider>(
              create: (context) => MainProvider(),
            ),
          ],
          child: ParentWidget(),
        );
      }
    }
    
    class ParentWidget extends StatelessWidget {
      final GlobalKey<AnimatedListState> listKey = GlobalKey<AnimatedListState>();
    
      @override
      Widget build(BuildContext context) {
        var mainProvider = Provider.of<MainProvider>(context);
    
        buildItem(BuildContext context, int index, Animation animation) {
          print('buildItem');
    
          var _object = mainProvider.list[index];
          var _widget;
    
          if (_object is Widget) {
            _widget = _object;
          } else if (_object is ModelItem) {
            _widget = Text(_object.unitNumber.toString());
          }
    
          return SizeTransition(
            key: ValueKey<int>(index),
            axis: Axis.vertical,
            sizeFactor: animation,
            child: InkWell(
              onTap: () {
                listKey.currentState.removeItem(index,
                    (context, animation) => buildItem(context, index, animation),
                    duration: const Duration(milliseconds: 300));
                mainProvider.list.removeAt(index);
                mainProvider.addCount();
              },
              child: Card(
                child: Padding(
                  padding: const EdgeInsets.all(32.0),
                  child: _widget,
                ),
              ),
            ),
          );
        }
    
        return Scaffold(
          appBar: AppBar(),
          body: Container(
            color: Colors.white,
            child: Padding(
              padding: const EdgeInsets.all(32.0),
              child: mainProvider.list == null
                  ? Container()
                  : AnimatedList(
                      key: listKey,
                      initialItemCount: mainProvider.list.length,
                      itemBuilder:
                          (BuildContext context, int index, Animation animation) =>
                              buildItem(context, index, animation),
                    ),
            ),
          ),
        );
      }
    }
    
    类ParentProvider扩展了无状态小部件{
    @凌驾
    小部件构建(构建上下文){
    回程多供应商(
    供应商:[
    变更通知提供者(
    create:(context)=>MainProvider(),
    ),
    ],
    子项:ParentWidget(),
    );
    }
    }
    类ParentWidget扩展了无状态Widget{
    最终GlobalKey listKey=GlobalKey();
    @凌驾
    小部件构建(构建上下文){
    var mainProvider=Provider.of(上下文);
    buildItem(BuildContext上下文、int索引、动画){
    打印(“构建项”);
    var_object=mainProvider.list[index];
    var_小部件;
    if(_对象是小部件){
    _widget=\u对象;
    }else if(_对象是ModelItem){
    _widget=Text(_object.unitNumber.toString());
    }
    返回大小转换(
    键:ValueKey(索引),
    轴:轴垂直,
    sizeFactor:动画,
    孩子:InkWell(
    onTap:(){
    listKey.currentState.removeItem(索引,
    (上下文,动画)=>buildItem(上下文,索引,动画),
    持续时间:常量持续时间(毫秒:300));
    mainProvider.list.removeAt(索引);
    mainProvider.addCount();
    },
    孩子:卡片(
    孩子:填充(
    填充:常数边集全部(32.0),
    child:_widget,
    ),
    ),
    ),
    );
    }
    返回脚手架(
    appBar:appBar(),
    主体:容器(
    颜色:颜色,白色,
    孩子:填充(
    填充:常数边集全部(32.0),
    子级:mainProvider.list==null
    ?容器()
    :动画列表(
    键:listKey,
    initialItemCount:mainProvider.list.length,
    项目生成器:
    (BuildContext上下文、int索引、动画)=>
    buildItem(上下文、索引、动画),
    ),
    ),
    ),
    );
    }
    }
    
    您正在从
    无状态小部件
    检索提供商。因此,
    ChangeNotifier
    无法触发小部件进行重建,因为没有要重建的状态。您必须将
    ParentWidget
    转换为
    StatefulWidget
    ,或者您需要使用
    Consumer
    而不是
    provider获得提供商。of

    类ParentWidget扩展了无状态widget{
    最终GlobalKey listKey=GlobalKey();
    @凌驾
    小部件构建(构建上下文){
    退货消费者(
    生成器:(BuildContext上下文,MainProvider MainProvider,382;){
    ...
    }
    );
    }
    


    另外,您使用提供程序的方式是将
    MainProvider
    添加到其提供程序中,然后从其直接子级中检索它。如果这是您检索
    MainProvider
    的唯一位置,这会使提供程序模式变得多余,因为您可以轻松地在
    ParentWidget
    或eve中声明它n只需使用
    FutureBuilder
    获取您的图像列表。使用提供商是实现正确状态管理的一个很好的步骤,但也要小心过度设计您的应用程序。

    您如何使用提供商?您在哪里通过
    ChangeNotifierProvider
    添加它?您在哪里使用
    Consumer
    获取它(或与之类似)?您好@Abion47,谢谢您的帮助。我有一个父ChangeNotifierProvider小部件,我通过子小部件上的Provider.of(上下文)访问其内容。我通过小部件构建下的Provider.of访问值,而我只使用消费者小部件,因为它的子小部件是在initList期间构建的。@Abio