为什么异步等待在这种情况下不起作用?

时间:2019-11-19 16:27:42

标签: listview flutter dart async-await

为什么async-await在我的情况下不起作用?我在pageA中有一个按钮。单击后,将弹出删除确认对话框。

一旦单击确认对话框中的Yes按钮,它将从服务器中删除数据并返回成功代码,即101返回到PageA。

一旦pageA收到返回值,它将刷新ListView

PageA按钮

onTap: () async {
  Navigator.pop(context);
  var result = await PopUpDialog().showDeleteDialog();
  if (result == 101) {
    setState(() {
      data.removeAt(index);   // remove the index in listView
    });
  } else {
    print('fjeodpedp');
  }
},

PopUpDialog

class PopUpDialog {
  var result;
  Future<int> showDeleteDialog() async {
         ....
    showDialog(
        context: context,
        builder: (BuildContext buildContext) {
          return AlertDialog(
              actions: <Widget>[
                FlatButton(
                  color: Colors.orange,
                  child: Text('YES', style: TextStyle(color: Colors.white)),
                  onPressed: () async {
                    Navigator.pop(buildContext);
                    result = await _bloc.delete();   // delete server data
                    if (result == 101) {
                      return result;
                    }
                  },
                ),
                FlatButton(
                  color: Colors.white,
                  child: Text('CANCEL'),
                  onPressed: () {
                    Navigator.of(buildContext, rootNavigator: true)
                        .pop('dialog');
                  },
                )
              ],
              ....
        });

    return 111; 
  }
}

但是问题是,一旦弹出删除确认对话框,我将得到 fjeodpedp

4 个答案:

答案 0 :(得分:0)

由于showDialog是异步的,因此您return 111在对话结束之前。

您可以尝试使用setState((){})代替它,这样不会太混乱

答案 1 :(得分:0)

显示对话框后,您将立即返回111。不确定您的意图是什么,但在我看来,您不需要此行,因为您正在处理页面A上的返回值。

尝试删除此行,然后看看它如何进行。

答案 2 :(得分:0)

如果您按如下所示进行操作,那会更好。

animation-play-state: running

答案 3 :(得分:0)

我通常将Function参数传递给我的 showDialog 函数,例如 onYes onCancel ,然后从 onTap onPressed 事件。

以下是基于您的原始代码的有效示例:

import 'package:flutter/material.dart';

class TestPage extends StatefulWidget {
  @override
  createState() => _TestPageState();
}

class _TestPageState extends State<TestPage> {
  final int index = 5; // Sample index
  final data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; // Sample data

  @override
  Widget build(BuildContext context) {  
    return Container(
      child: RaisedButton(
        child: Text("Click me"),
        onPressed: () {
          showDeleteDialog(
            onYes: () { // This will be called when user taps 'YES'
              setState(() {
                data.removeAt(index); // remove the index in listView
                print("removed");
              });
            },
            onCancel: () { // This will be called when user taps 'CANCEL'
              print('fjeodpedp');
            }
          );
        },
      ),
    );
  }

  void showDeleteDialog({Function onYes, Function onCancel}) async {
    showDialog(
      context: context,
      builder: (BuildContext buildContext) {
        return AlertDialog(
          actions: <Widget>[
            FlatButton(
              color: Colors.orange,
              child: Text('YES', style: TextStyle(color: Colors.white)),
              onPressed: () async {
                Navigator.pop(buildContext);
                if (null != onYes) onYes(); // Ensure the reference exists before calling it
              },
            ),
            FlatButton(
              color: Colors.white,
              child: Text('CANCEL'),
              onPressed: () {
                Navigator.pop(buildContext);
                if (null != onCancel) onCancel(); // Ensure the reference exists before calling it
              },
            )
          ],
        );
      }
    );
  }
}

希望这会有所帮助:)