【问题标题】:NoSuchMethodError: The getter 'surname' was called on nullNoSuchMethodError:在 null 上调用了 getter 'surname'
【发布时间】:2019-04-02 09:41:06
【问题描述】:

我正在使用自定义BaaS 运行login 进程。提交按钮运行onPressed 方法,该方法检查Response response; if reponse.statusCode == 200 然后将fromJson(reponse.data).surnamefromJson(response.data).firstname 发送到Homepage 屏幕。我已经设置了到Homepage 屏幕的通道并且它可以工作,但是当我尝试Hot Reload 应用程序然后尝试访问主页时,它会抛出NoSuchMethodError I/flutter (14935): The getter 'surname' was called on null. 我该如何解决这个问题?

我尝试将widget.data.surname 分配给initState 中的随机string,它可以清除错误,但不会将widget.data.surnamewidget.data.firstname 重新分配给fromJson(reponse.data).surname 和@987654339 @

class Data
{
  String surname = '';
  String firstname= '';

  Data ({this.surname, this.firstname});
}
Response response;
          Dio dio = new Dio();
          response = await dio.get(findUrl, queryParameters: {"username": _username, "password": _password});
          print(response.statusCode);

          if(response.statusCode == 200){
            print(UsersInfo.fromJson(response.data).surname);

            userSurname = UsersInfo.fromJson(response.data).surname;

            userFirstname = UsersInfo.fromJson(response.data).firstname;

            var data = Data (
              surname: userSurname,
              firstname: userFirstname
            );

            Fluttertoast.showToast(
                msg: "Login successful",
                toastLength: Toast.LENGTH_LONG,
                gravity: ToastGravity.BOTTOM,
                timeInSecForIos: 6,
                backgroundColor: Colors.black,
                textColor: Colors.white,
                fontSize: 16.0
            );

            Future.delayed (Duration(seconds: 7),
                    () async {
                  Navigator.push(context,
                      MaterialPageRoute(builder: (context) => HomePage(data: data))
                  );
                  print('7 seconds');
                }
            );
          }

第二个屏幕(主页屏幕)

Data data;

  HomePage ({this.data});
enum AuthStatus {
  notSignedIn,
  signedIn
}
AuthStatus _authStatus = AuthStatus.notSignedIn;

  @override
  initState() {
    super.initState();
    setState(() {
      widget.data = Data (surname: '', firstname: '');
       _authStatus = ((widget.data.surname == '')) ? AuthStatus.notSignedIn : AuthStatus.signedIn;
    });
  }

【问题讨论】:

    标签: android json flutter response


    【解决方案1】:

    Widget 中的数据是最终的。如果您在那里更改一个版本,请保持其状态。然后在 initState 中执行:

    _data = widget.data ?? Data();
    

    编辑:我遗漏了重要说明。不要在 initState 中调用 setState,它还没有构建,你在那里设置的任何数据都会在第一次绘制时在那里。

    并更改数据类,使其具有默认参数:

    class Data{
      final String surname;
      final String firstname;
    
      Data ({this.surname = '', this.firstname = ''});
    }
    

    或者您甚至可以添加从 UsersInfo 对象中提取的工厂:

    Data.fromUsersInfo(UsersInfo info) : firstname = info.firstname, surname = info.surname;
    

    然后在 onPressed 方法中,您可以使用以下方法制作数据:

    var data = Data.fromUsersInfo(UsersInfo.fromJson(response.data));
    

    我不确定您还对这些数据做了什么,但这应该可以:)

    【讨论】:

    • 谢谢,我会尝试并回复您
    • 我已经尝试过你所说的但我仍然遇到同样的错误
    • Keep one version in state if you change it there 是什么意思?
    • 进行更改后,我所做的只是重新启动我的 Intellij IDE,它工作正常。谢谢一百万。
    • 抱歉没来。但是是的,只是为了将数据对象的第二个实例保留在状态类中,因此您无需重新分配 widget.data。然后您调用 setState 并更改而不是更改 widget.data,(因为该字段应该是最终的并且不可更改)。
    猜你喜欢
    • 2021-07-18
    • 2018-12-03
    • 2020-06-15
    • 2020-12-26
    • 1970-01-01
    • 2020-08-11
    • 2020-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多