Flutter 如何在颤振提供程序中正确初始化未来
因此,我正试图建立一个名单,在我的供应商从未来的电话 到目前为止,我有以下ChangeNotifier类: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(); }
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();
}
}
但是,每当我使用列表值时,就会发生这种情况:
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