【问题标题】:How onPressed: func is different from onPressed: () => func() in Dart?onPressed: 函数与 Dart 中的 onPressed: () => function() 有何不同?
【发布时间】:2022-01-08 12:23:15
【问题描述】:

我有一堂课:

class Foo {
  void bar() {}
}

我是这样使用它的:

Widget build() {
  late Foo foo;

  return Column(
    children: [
      ElevatedButton(
        onPressed: foo.bar, // Error: 
        child: Text('Use'),
      ),
      ElevatedButton(
        onPressed: () => foo = Foo(), // Assigning foo here
        child: Text('Initialize'),
      ),
    ],
  );
}

在这一点上,后期的局部变量 'foo' 肯定是未赋值的。 (文档)

如您所见,我正在使用 late 关键字向分析器提示我稍后将实例化,但我仍然看到错误,为什么?


注意:我不是在寻找关于如何使其工作的解决方案,而是为什么它不起作用?

【问题讨论】:

    标签: flutter dart dart-null-safety


    【解决方案1】:

    因为您是在为children 参数创建Column 对象的过程中立即创建列表。该列表包含两个ElevatedButton 对象,它们也是作为创建列表的一部分立即创建的。为了创建第一个 ElevatedButton,我们提供了两个参数,onPressedchild,它们的值被解析并发送到 ElevatedButton 构造函数。

    问题在于,要解决foo.bar,它需要从foo 获取bar。但是foolate 并且在这一点上肯定没有被分配任何值,因为没有其他代码正在运行可以为其提供值。

    请注意,当我们向方法/构造函数提供参数时,我们获得的值会在我们在方法/构造函数中运行代码之前解析。此外,我们正在获取引用的副本,因此 foo.bar 需要解析为某个值,因为我们不能将其用作某种指向 build() 中的 foo 变量的指针,然后检查它是否设置为ElevatedButton 对象中的一个值。

    【讨论】:

    • 感谢您的回答,我知道您提到的几乎所有内容,但我的问题是 onPressed: () => foo.bar() 是允许的,但这不是 onPressed: foo.bar。你的意思是在前面的部分,我们懒惰地调用这个调用,而在后面的部分,我们立即调用它?
    • onPressed: () => foo.bar()onPressed 提供了一个函数,该函数在执行时运行foo.bar()onPressed: foo.bar 表示解析foo.bar 现在指向的函数,并将该函数作为参数传递给onPressed。在这两种情况下,我们都需要确定需要为onPressed 提供什么功能。但在第一种情况下,提供的函数将是我们在现场创建的未命名函数。该函数包含一个调用foo.bar()。但是在我们调用这个未命名的函数之前不需要解决这个问题。
    • 再次,参数需要在进入函数本身之前解析为一个值。就好像你有一个带有String 参数的函数一样。这个参数可以来自很多不同的操作,但是当你在你的函数中时,参数是String,你可以随意请求它,它会保留这个值,因为这个值在进入之前已经被解析了你的方法。
    • 我应该补充一点 onPressed: () => foo.bar() (与您的问题不同)可能不安全,因为我们不知道何时执行以 onPressed 给出的函数,所以如果 foo 有任何那个时候的价值。但 Dart 并没有抱怨这种风险,因为 foo 被标记为 late,作为开发人员,你的工作就是确保这是安全的。您收到onPressed: foo.bar 错误的原因再次是,我们在这里确定foo 不可能在您的示例中获得任何值,因此即使该字段被标记,Dart 也会给您一个警告late.
    猜你喜欢
    • 2019-03-30
    • 1970-01-01
    • 2023-02-18
    • 1970-01-01
    • 2022-08-18
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    相关资源
    最近更新 更多