【问题标题】:Flutter awaiting result of dialog颤振等待对话框的结果
【发布时间】:2020-11-25 15:28:58
【问题描述】:

我有以下代码,通过单击平面按钮调用:

_performOrderCheck(BuildContext context) async {
    bool _checksCompleted = await _performBundleCheck(context);
    print("Sepp");
    print(_checksCompleted);

    if (_checksCompleted) {
      _addArticleToOrder(_innerQty, _article);
      Navigator.pop(context);
    }
  }

Future<bool> _performBundleCheck(BuildContext context) async {
    //check bundles
    if (!_article.checkBundeledArticles()) {
      showDialog(
          context: context,
          builder: (_) => AlertDialog(
                title: Text('Menü unvollständig'),
                content: Text(
                    'Sie haben nicht alle möglichen Artikel gewählt. Wollen sie dennoch fortfahren?'),
                actions: <Widget>[
                  FlatButton(
                      onPressed: () {
                        Navigator.pop(_);
                        return false;
                      },
                      child: Text('Nein')),
                  FlatButton(
                      onPressed: () {
                        //_addArticleToOrder(_innerQty, _article);
                        Navigator.pop(_);
                        return true;
                        //Navigator.pop(context);
                      },
                      child: Text('Ja')),
                ],
                elevation: 24,
              ),
          barrierDismissible: false);
    } else {
      return true;
    }
  }

我想要的是可以等待用户决定,然后调用“_addArticleToOrder”。这可能吗?

感谢您的帮助。

【问题讨论】:

    标签: flutter async-await dialog


    【解决方案1】:

    您可以在 showdialog 前面添加 await 关键字,并在 show dialog 结束时返回值。

    添加等待。

      await showDialog(
    

    添加返回值

     barrierDismissible: false);
          return true; // added line
    

    【讨论】:

      【解决方案2】:

      当接受的答案有效时,结果总是返回 true

      如果您想获得对话框的结果,点击“Nein”可能为 false,点击“Ja”可能为 true,代码如下:

      import 'package:flutter/material.dart';
      
      void main() {
        runApp(MyApp());
      }
      
      class MyApp extends StatelessWidget {
        @override
        Widget build(BuildContext context) {
          return MaterialApp(
            title: 'Flutter Demo',
            theme: ThemeData(
              primarySwatch: Colors.blue,
            ),
            home: MyHomePage(title: 'Flutter Demo Home Page'),
          );
        }
      }
      
      class MyHomePage extends StatefulWidget {
        MyHomePage({Key key, this.title}) : super(key: key);
      
        final String title;
      
        @override
        _MyHomePageState createState() => _MyHomePageState();
      }
      
      class _MyHomePageState extends State<MyHomePage> {
        int _counter = 0;
      
        void _incrementCounter() {
          setState(() {
            _counter++;
          });
        }
      
        @override
        Widget build(BuildContext context) {
          return Scaffold(
            appBar: AppBar(
              title: Text(widget.title),
            ),
            body: Center(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  Text(
                    'You have pushed the button this many times:',
                  ),
                  Text(
                    '$_counter',
                    style: Theme.of(context).textTheme.headline4,
                  ),
                ],
              ),
            ),
            floatingActionButton: FloatingActionButton(
              onPressed: () async {
                _performOrderCheck(context);
              },
              // onPressed: _incrementCounter,
              tooltip: 'Increment',
              child: Icon(Icons.add),
            ), // This trailing comma makes auto-formatting nicer for build methods.
          );
        }
      
        _performOrderCheck(BuildContext context) async {
          _incrementCounter();
      
          print("_performOrderCheck called");
          bool _checksCompleted = await _performBundleCheck(context);
          print("_checksCompleted result: $_checksCompleted");
      
          if (_checksCompleted) {
            print("_checksCompleted");
          }
        }
      
        Future<bool> _performBundleCheck(BuildContext context) async {
          //check bundles
          if (true) {
            return await showDialog(
              context: context,
              builder: (_) => AlertDialog(
                title: Text('Menü unvollständig'),
                content: Text(
                    'Sie haben nicht alle möglichen Artikel gewählt. Wollen sie dennoch fortfahren?'),
                actions: <Widget>[
                  FlatButton(
                      onPressed: () {
                        Navigator.pop(context, false);
                      },
                      child: Text('Nein')),
                  FlatButton(
                      onPressed: () {
                        Navigator.pop(context, true);
                      },
                      child: Text('Ja')),
                ],
                elevation: 24,
              ),
              barrierDismissible: false,
            );
          } else {
            return true;
          }
        }
      }
      

      使用Navigator.pop(context, false);Navigator.pop(context, true); 会将对话结果返回给showDialog。 使用return await 会将其从_performBundleCheck 函数返回到_performOrderCheck

      【讨论】:

        猜你喜欢
        • 2020-10-25
        • 1970-01-01
        • 2020-09-01
        • 2023-04-07
        • 2022-11-11
        • 2021-05-29
        • 1970-01-01
        • 1970-01-01
        • 2020-06-02
        相关资源
        最近更新 更多