Ошибка функции обратного вызова во флаттере - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть две функции обратного вызова в виджете с состоянием, которые вызываются двумя разными экранами. Вот как я их объявил в виджете с состоянием (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 получает эту ошибку. Метод 'call' был вызван для null.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),
      ),

1 Ответ

1 голос
/ 20 апреля 2020

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(), поэтому он не существует, и выдается исключение.

Если вы не хотите назначать пустую реализацию тела свойству finalBetList внутри HomeScreen, у вас также есть возможность назначить его в конструкторе.

Другой вариант, о котором я могу подумать, - это вызов функции с использованием условного доступа к члену:

widget.finalBetList?.call(counter);

Все объекты функции имеют метод call(), который выполняет тело функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...