Как отправить объект List через функцию обратного вызова во Flutter? - PullRequest
0 голосов
/ 17 апреля 2020

Что я уже сделал

У меня есть виджет с состоянием, который генерирует ListView на экране.

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

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

  @override
  _AppListViewState createState() => _AppListViewState();
}

class _AppListViewState extends State<AppListView> {
  int counter = 0;
  List<MatchList> betList = List<MatchList>();

У меня есть главный экран, который вызывает это Stateful Widget. Здесь я использую функцию обратного вызова (onChange), чтобы получить значение счетчика из виджета. Все работает идеально.

Stack(children: [
          AppListView(
            matchList: matchList,
            //callback function brings the counter value from ListView class
            onChange: (value) {
              setState(() {
                counter = value;
              });
            },
          ),
          Positioned(
            child: Padding(
              padding: const EdgeInsets.only(top: 280.0, left: 330.0),
              child: Container(
                width: 60,
                height: 60,
                child: FloatingActionButton(
                  onPressed: () {
                    counter > 0
                        ? Navigator.pushNamed(context, BetScreen.id)
                        : print('you shall not pass');
                  },
                  child: Text(
                    counter.toString(),
                    style: kTextStyleAppBarTitle,
                  ),
                ),
              ),
            ),
          )
        ])

В чем проблема

Но когда я пытаюсь вызвать этот виджет с другого экрана с помощью аналогичной функции обратного вызова (finalBetList) , Я получил сообщение об ошибке "Метод 'call' вызван нулем. Receiver: null". На самом деле все, что я делаю, совпадает с другим примером, который работает нормально. Я не могу найти то, что мне не хватает. Это что-то о списках?

class _BetScreenState extends State<BetScreen> {
  List<MatchList> betList = List<MatchList>();
  int counter = 0;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: CustomAppBar(
        currentBalance: '\u0024' + '200.00',
        userLevel: 'Level 30',
        userName: 'Mark',
      ),
      body: Container(
        child: AppListView(
          finalBetList: (value) {
            setState(() {
              //counter = value;
              betList = value;
              //print(betList);
            });
          },
          matchList: betList,
        ),
      ),
    );
  }
}

После редактирования

Я добавил код виджета AppListView

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

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

      @override
      _AppListViewState createState() => _AppListViewState();
    }

    class _AppListViewState extends State<AppListView> {
      int counter = 0;
      List<int> betList = List<int>();

      @override
      Widget build(BuildContext context) {

                                children: <Widget>[
                                  AppButton.buildAppButton(
                                    context,
                                    AppButtonType.BETSELECTION,
                                    widget.matchList[index].homeOdds,
                                    kCategoryButtonDimensions,
                                    color: widget.matchList[index].homeSelected
                                        ? Colors.yellow
                                        : Colors.white,
                                    onPressed: () {
                                      if (widget.matchList[index].drawSelected ||
                                          widget.matchList[index].awaySelected) {
                                        widget.matchList[index].drawSelected =
                                            false;
                                        widget.matchList[index].awaySelected =
                                            false;
                                        counter--;

                                        //betList part
                                        if (betList.length > 0)
                                          betList
                                              .remove(widget.matchList[index].id);
                                      }
                                      widget.matchList[index].homeSelected =
                                          !widget.matchList[index].homeSelected;

                                      if (widget.matchList[index].homeSelected) {
                                        counter++;
                                        betList.add(widget.matchList[index].id);
                                      } else {
                                        counter--;
                                        if (betList.length > 0)
                                          betList.remove(widget.matchList[index]
                                              .id); //if selected, add to betList to send BetScreen
                                      }
                                      widget.onChange(counter);
                                      print(betList);
                                      widget.finalBetList(betList);

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