![](/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.