Необработанное исключение: NoSuchMethodError: метод 'next' был вызван в null - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть 4 класса SignUp, Auth, PageOne и InWidget (унаследованный виджет). В classe signUpState у меня есть свипер, которым я могу управлять с помощью контроллера.

SignUp

class SignUp extends StatefulWidget {
  static const String id = 'history_page';
  @override
  SignUpState createState() => SignUpState();
  goto(bool x) => createState().goto(x);
}

SignUpState

class SignUpState extends State<SignUp> {

 SwiperController _swOneCtrl;

  @override
  void initState() {
    _swOneCtrl = new SwiperController();
    super.initState();
  }

  goto(bool anim){
     _swOneCtrl.next(animation: anim);
    print("goto fired");
  }
}

Auth

class Auth extends StatelessWidget {
    SignUp s =  SignUp();
 verifyPhoneNumber() {
    s.goto(true);
  }    
 }

PageOne

class PageOneState extends State<PageOne> {
@override
  Widget build(BuildContext context) {
    final MyInheritedWidgetState state = MyInheritedWidget.of(context);
    return RaisedButton(
                color: Colors.blueGrey,
                disabledColor: Colors.grey[100],
                textColor: Colors.white,
                elevation: 0,
                onPressed: !phonebtn
                    ? null
                    : () {
                        final MyInheritedWidgetState state =
                            MyInheritedWidget.of(context);
                        state.verifyPhoneNumber();
                      },
                child: Text("CONTINUER"),
              ),
            );
}
}

Дело в том, что я хочу вызвать verifyPhoneNumber () из auth, который будет вызывать метод goto () из pageone, используя inwidget в качестве посредника, но я получаю эту ошибку:

Unhandled Exception: NoSuchMethodError: The method 'next' was called on null.

знаете почему?

Ответы [ 2 ]

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

Попробуйте выполнить инициализацию во время объявления.

class SignUpState extends State<SignUp> {

 SwiperController _swOneCtrl = new SwiperController();

  @override
  void initState() {
    super.initState();
  }

  goto(bool anim){
     _swOneCtrl.next(animation: anim);
    print("goto fired");
  }
}

Ответьте мне, если это работает.

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

initState() - это метод, который вызывается один раз, когда виджет с состоянием вставляется в дерево виджетов.

Обычно мы переопределяем этот метод, если нам нужно выполнить какую-то работу по инициализации, такую ​​как регистрация слушателя, потому что в отличие от build () этот метод вызывается один раз.

Как я думаю, вы объявляете контроллер Swipe в своем классе SignUPState.

class SignUpState extends State<SignUp> {

 SwiperController _swOneCtrl;

  @override
  void initState() {
    _swOneCtrl = new SwiperController();
    super.initState();
  }

  goto(bool anim){
     _swOneCtrl.next(animation: anim);
    print("goto fired");
  }
}

Но вы инициализировали его в initState(). проблема заключается в том, что вы не вставляете свой виджет SignUp в дерево виджетов, поэтому ваш контроллер перелистывания не инициализируется и становится пустым. Поэтому, когда вы вызываете следующий метод с нулевым значением, он показывает ошибку.

В качестве решения сначала вставьте свой виджет регистрации в дерево виджетов.

, если мое решение помогло вы. Пожалуйста, оцените меня.

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