【发布时间】:2021-08-02 06:57:39
【问题描述】:
我有以下有状态的小部件
class ItemDetailsScreen extends StatefulWidget {
Item item;
ItemDetailsScreen({required Key key, required this.item}) : super(key: key);
@override
_ItemDetailsScreenState createState() => _ItemDetailsScreenState();
}
class _ItemDetailsScreenState extends State<ItemDetailsScreen> {
late UserStore _userStore;
late Item _item;
@override
void initState() {
_item = widget.item;
super.initState();
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
_userStore = Provider.of<UserStore>(context);
}
@override
Widget build(BuildContext context){
//build view of item data and button...
}
//...
}
我想更新项目并在单击按钮时显示它。
我的按钮代码:
onPressed: () async {
await _userStore.updateItem(item.id!);
setState(() {
_item = _item;
});
});
updateItem 方法:
@action //mobx annotation
Future updateItem(String itemId) async {
_repository.updateItem(itemId).then((isUpdated) {
for (var i = 0; i < this.user!.itemsList.length; i++) {
if (itemId== this.user!.itemsList[i].id) {
this.user!.itemsList[i].value = this.user!.itemsList[i].value ! + 1;
}
}
});
}
当我触发按钮上的 onPressed 时,它总是显示更新之前的旧项目值。
updateItem 上的 await 没有像我预期的那样工作:在 updateItem 执行完成之前调用了 setState 方法。
我也试过_userStore.updateItem(item.id!).then((value) => {...});,但没有运气。
我怎样才能让这个等待工作?
【问题讨论】:
-
return _repository.updateItem(itemId).then((isUpdated) { ...- 但实际上你为什么在async方法中使用Future.then?它只会让事情变得复杂 -
谢谢,它与return语句一起使用,并且在删除Future之后效果更好。那么,感谢您的建议:)
-
当然,欢迎您
标签: flutter dart widget flutter-layout