如何从Dart中的函数返回Future或任何其他类型

时间:2018-07-23 12:06:09

标签: dart flutter

我需要处理我的一个Form条目小部件上的后退按钮按下。这就是我实现WillPopScope的onWillPop方法的方式:

.PHONY : gen_files fresh clean all

all :
    compile executable

clean :
    rm -f *.o $(EXEC)

fresh : clean clearscr all

clearscr:
    clear
gen_files: 
   $(MAKE) -C ANOTHER_DIR_WHICH_GENERATES_FILE_NEEDED_BY_EXECUTABLE

这部分代码正常工作,但出现异常:

Future<bool> _onWillPop() {
    if (changed) {
       return showDialog(
        context: context,
        builder: (context) => new AlertDialog(
              title: new Text('Save'),
              content: new Text("Do you want to save the changes?"),
              actions: <Widget>[
                new FlatButton(
                  onPressed: () => Navigator.of(context).pop(true),
                  child: new Text('No'),
                ),
                new FlatButton(
                  onPressed: () {
                    Navigator.of(context).pop(false);
                    saveMeeting();
                  },
                  child: new Text('Yes'),
                ),
              ],
            ),
      ) ??
      false;
    } else {
      print("No changes");
      Navigator.of(context).pop(true);
      //return some future null from here ????
    }
}

我该如何正确实施?

3 个答案:

答案 0 :(得分:5)

我遇到了完全相同的问题。

我通过返回Future.value(false);解决了它。如果值为true,则显示黑屏。

Select 
    Sum(`Unit Price`) as TotalPrice, 
    Count(`Order ID`) as NumOfDiffProds, 
    Avg(`Quantity`) as AvgQuantity, 
    Avg(`Discount`) as AvgDiscount
From 
    `Order Details`
Where 
    `Order ID` = 1

答案 1 :(得分:1)

导入“ dart:async”包, 并将async关键字添加到您的方法签名中,例如

Future<bool> _onWillPop() async{

此后,只要您的方法像其他任何函数一样完成处理,就只需要返回一个布尔值

答案 2 :(得分:1)

  

您的评论:我需要在按下“后退”按钮时显示警报。   如果用户对数据进行了任何更改,则更改将变为true   而且那时我只需要显示警报。

您不必检查。

您可以参考以下示例(摘自here you can see a complete example的官方材料示例)并了解一些想法:

import 'package:flutter/material.dart';
import 'dart:async';

bool _formWasEdited = false;

final GlobalKey<FormState> _formKey = new GlobalKey<FormState>();

Future<bool> _warnUserAboutInvalidData() async {
    final FormState form = _formKey.currentState;
    if (form == null || !_formWasEdited || form.validate())
      return true;

    return await showDialog<bool>(
      context: context,
      builder: (BuildContext context) {
        return new AlertDialog(
          title: const Text('This form has errors'),
          content: const Text('Really leave this form?'),
          actions: <Widget> [
            new FlatButton(
              child: const Text('YES'),
              onPressed: () { Navigator.of(context).pop(true); },
            ),
            new FlatButton(
              child: const Text('NO'),
              onPressed: () { Navigator.of(context).pop(false); },
            ),
          ],
        );
      },
    ) ?? false;
  }

Form小部件中:

child: new Form(
    key: _formKey,
    autovalidate: _autovalidate,
    onWillPop: _warnUserAboutInvalidData,
    //........