![](/img/trans.png)
[英]How to initialize a Future and then replace it in Flutter/Dart?
[英]How to properly initialize a Future in Flutter Provider
所以我试图通过 Future Call 在我的提供商中建立一个列表。
到目前为止,我有以下 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();
}
}
但是,每当我使用列表值时都会发生这种情况:
笔记:
我真正关心的是,在初始加载时,我的列表值没有按预期正确初始化所有值
希望大家能帮我解决这个问题。 谢谢你。
更新:下面显示了我如何使用上面的 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),
),
),
),
);
}
}
您正在从StatelessWidget
检索您的提供者。 因此, ChangeNotifier
无法触发您的小部件重建,因为没有要重建的状态。 您必须将ParentWidget
转换为StatefulWidget
或者您需要使用Consumer
而不是Provider.of
来获取您的提供Provider.of
:
class ParentWidget extends StatelessWidget {
final GlobalKey<AnimatedListState> listKey = GlobalKey<AnimatedListState>();
@override
Widget build(BuildContext context) {
return Consumer<MainProvider>(
builder: (BuildContext context, MainProvider mainProvider, _) {
...
}
);
}
顺便说一句,您使用 provider 的方式是将MainProvider
添加到其提供者,然后从其直接子项中检索它。 如果这是您检索MainProvider
的唯一位置,则这会使提供者模式变得多余,因为您可以轻松地在ParentWidget
声明它,或者甚至只是使用FutureBuilder
获取图像列表。 使用 provider 是实现正确状态管理的良好步骤,但也要小心过度设计您的应用程序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.