【问题标题】:Unhandled Exception: NoSuchMethodError: The method 'next' was called on null未处理的异常:NoSuchMethodError:在 null 上调用了方法“next”
【发布时间】:2020-04-01 20:19:27
【问题描述】:

我有 4 个类 SignUp 、 Auth、 PageOne 和 InWidget(继承的小部件)。在 classe signUpState 中,我有一个可以使用控制器控制的 swiper。

注册

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

注册状态

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");
  }
}

授权

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

一页

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"),
              ),
            );
}
}

问题是我想从 auth 调用 verifyPhoneNumber(),它将使用 inwidget 作为中介从 pageone 调用 goto() 方法,但我收到此错误:

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

你知道为什么吗?

【问题讨论】:

    标签: flutter swiper unhandled-exception


    【解决方案1】:

    尝试在声明时初始化。

    class SignUpState extends State<SignUp> {
    
     SwiperController _swOneCtrl = new SwiperController();
    
      @override
      void initState() {
        super.initState();
      }
    
      goto(bool anim){
         _swOneCtrl.next(animation: anim);
        print("goto fired");
      }
    }
    

    如果有效,请回复我。

    【讨论】:

    • 我得到了日志“goto 被解雇”,但它没有动画。你知道如何从另一个页面构建一个页面的小部件树吗?
    【解决方案2】:

    initState() 是当有状态小部件插入小部件树时调用一次的方法。

    如果我们需要做一些初始化工作,比如注册一个监听器,我们通常会覆盖这个方法,因为与 build() 不同,这个方法只被调用一次。

    我认为您在 SignUPState 类中声明了 Swipe 控制器。

    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() 中初始化了它。问题是因为您没有在小部件树中插入您的注册小部件,因此您的滑动控制器没有初始化并变为空。因此,当您调用下一个方法为 null 时,它会显示错误。

    作为解决方案,首先将您的注册小部件插入小部件树中。

    如果我的解决方案对您有所帮助。请给我打分。

    【讨论】:

      猜你喜欢
      • 2020-02-23
      • 2020-01-11
      • 2021-02-11
      • 2021-06-10
      • 2020-04-20
      • 2021-01-04
      • 1970-01-01
      • 2020-10-29
      • 2022-11-17
      相关资源
      最近更新 更多