【问题标题】:Flutter await future ignored on button click颤振等待未来按钮点击被忽略
【发布时间】: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) =&gt; {...});,但没有运气。 我怎样才能让这个等待工作?

【问题讨论】:

  • return _repository.updateItem(itemId).then((isUpdated) { ... - 但实际上你为什么在async 方法中使用Future.then?它只会让事情变得复杂
  • 谢谢,它与return语句一起使用,并且在删除Future之后效果更好。那么,感谢您的建议:)
  • 当然,欢迎您

标签: flutter dart widget flutter-layout


【解决方案1】:

您是否尝试在 then 方法中添加 setState?

_userStore.updateItem(item.id!).then((value) => setState(() {
          _item = _item;
        }););

【讨论】:

  • 是的,我试过了,但结果相同
猜你喜欢
  • 1970-01-01
  • 2021-03-26
  • 1970-01-01
  • 2021-03-06
  • 2013-06-21
  • 2021-09-14
  • 1970-01-01
  • 2020-10-25
  • 1970-01-01
相关资源
最近更新 更多