【问题标题】:Understanding dynamic property of Async/Await in Flutter了解 Flutter 中 Async/Await 的动态属性
【发布时间】:2020-04-15 18:48:14
【问题描述】:

我是 Flutter 新手,并通过有关 Flutter 的教程进行学习。我正在从已完成的项目中学习,所以有时我对代码不了解。一个例子,我理解下面的代码,但我不明白这一行==> dynamic result = await Navigator.pushNamed(context, '/location'); 我正在检查 dynamic 属性,但找不到任何有关它的信息。为什么该项目使用 awaitdynamic 属性(dynamic 属性是什么意思?)

FlatButton.icon(
                        onPressed: () async {
                          dynamic result = await Navigator.pushNamed(context, '/location');
                          setState(() {
                            print("result $result");
                            data={
                              'time' : result['time'],
                              'location':result['location'],
                              'isDaytime':result['isDaytime'],
                              'flag':result['flag'],
                            };
                          });
                        },
                        icon: Icon(
                          Icons.edit_location,
                          color: Colors.green[100],
                        ),
                        label: Text(
                          "Edit Location",
                          style: TextStyle(
                            color: Colors.grey[200],
                          ),
                        )),

【问题讨论】:

标签: flutter async-await


【解决方案1】:

传递给onPressed()的匿名函数被标记为async,因为它有异步代码,即这行代码:

dynamic result = await Navigator.pushNamed(context, '/location');

基本上就是说这个操作的结果不是立即返回,而是需要一些时间才能完成。

Navigator.pushNamed() 打开新页面(在本例中是在“/location”路径下注册的页面)并且可以在用户关闭此页面时使用Future 返回一些数据。使用await 关键字,您可以等待下一个分配给result 变量的数据。如果没有await,您将分配Future

方法pushNamed() 准备返回任何类型的数据。 dynamic 是一种通用数据类型,因此它可以接受数值、字符串、列表等。但是,作为开发人员,您可以(如果您愿意)通过强制转换 pushNamed() 的返回值来显式设置 result 变量的数据类型.因此,假设返回的数据是Map<String, Object> 类型,您可以将上面的代码行重构为:

Map<String, Object> result = (await Navigator.pushNamed(context, '/location')) as Map<String, Object>;

有关从屏幕返回值的更多信息,请访问page

【讨论】:

    【解决方案2】:

    Async/Await 由其他答案解释,所以让我们看看dynamic 关键字。

    int x; 表示 x 中存储的值只能是整数,不能是其他任何值。 现在x = 1.0; 是不可能的。


    var b = 2.0; 有点不同,这里隐含的类型是double,相当于double b = 2.0double b = 2

    所以b = true 是不可能的,但b = 1; 可以工作,因为它将被存储为1.0(double) 而不是1(int)


    来到dynamic,表示类型不固定,可以改变。

    所以, dynamic x = 1; 然后

    x = 2.0; 不会出错。


    现在,代码dynamic result = await Navigator.pushNamed(context, '/location'); 这意味着当我们从新页面返回时,结果可以有任何类型并且不是固定的。

    但是,假设新页面保证返回 truefalse 即布尔值,那么您也可以编写

    bool result = await Navigator.pushNamed(context, '/location');
    

    【讨论】:

      猜你喜欢
      • 2020-03-25
      • 2012-12-20
      • 1970-01-01
      • 1970-01-01
      • 2018-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-19
      相关资源
      最近更新 更多