【问题标题】:Callback function issue in flutter颤振中的回调函数问题
【发布时间】:2020-08-02 16:15:18
【问题描述】:

我在有状态小部件中有两个回调函数,它们被两个不同的屏幕调用。这是我在有状态小部件(onChange 和 finalBetList)中声明它们的方式;

class AppListView extends StatefulWidget {
  final ValueChanged onChange;
  final List<MatchList> matchList;
  final ValueChanged finalBetList;

  AppListView({this.onChange, this.matchList, this.finalBetList});

这就是我在小部件的状态类中实现它们的方式。即使我尝试传递相同的参数 onChange 工作正常但 finalBetList 得到这个错误。 在 null 上调用了“call”方法。Receiver:null 尝试调用:call(1)

widget.onChange(counter);
widget.finalBetList(counter);

一切都一样,其中一个正在工作,但另一个出现错误。我错过了什么?

编辑

这是我从 HomeScreen 调用有状态小部件的代码(效果很好)

          Stack(children: [
              AppListView(
                matchList: matchList,
                //callback function brings the counter value from ListView class
                onChange: (value) {
                  setState(() {
                    counter = value;
                  });
                },
              ),

这是我从第二个屏幕调用有状态小部件的代码(出现错误)

body: Container(
        child: AppListView(
            onChange: (value) {},
            finalBetList: (value) {
              counter = value;
              setState(() {
                //counter = value;
              });
            },
            matchList: matchList),
      ),

【问题讨论】:

  • 提供实例化 AppListView 的代码
  • 我将代码添加到问题的末尾
  • 你确定第一个代码 sn -p 是完美运行的吗?因为您没有指定 finalBetList,所以它保留为 null
  • onChange 完美运行,finalBetList 出错。有什么区别?
  • 你说你不指定finalBetList是什么意思?

标签: function flutter dart callback parameter-passing


【解决方案1】:

TL;DR

finalBetList 属性分配一个空主体实现

Stack(children: [
              AppListView(
                matchList: matchList,
                finalBetList: (value) {}, // <- NEW CODE IS HERE
                //callback function brings the counter value from ListView class
                onChange: (value) {
                  setState(() {
                    counter = value;
                  });
                },
              ),

为什么要这样做?

在 Dart 中,函数是对象。对象,如果没有赋值,则为null。在HomeScreen 的代码示例中,您为onChange 分配了一个值,因此稍后当您通过widget.onChange(counter) 调用它时,onChange 被评估为函数对象并执行其主体。

但是,在同一个示例中,您没有为finalBetList 分配任何值,因此它保留为null。当你调用widget.finalBetList(counter) 时,finalBetList 会被评估,它显然不是一个函数对象。在这一点上,你会排除一个错误,但这并不是故事的结尾——因为不仅可以调用函数对象。也可以调用任何实现call() 方法的类。因此尝试调用finalBetList.call()。这是您应该得到的例外:

NoSuchMethodError: The method 'call' was called on null.
Receiver: null

显然null 没有实现call() 方法,因此它不存在并引发异常。

如果您不想将空主体实现分配给HomeScreen 内的finalBetList 属性,您还可以选择在构造函数中分配它。

我能想到的另一个选择是使用条件成员访问来调用函数:

widget.finalBetList?.call(counter);

所有函数对象都有call() 方法来执行函数的主体。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-04
    • 2021-11-27
    • 2021-11-16
    • 2021-05-05
    • 2022-01-12
    • 2021-10-20
    • 1970-01-01
    相关资源
    最近更新 更多