NoSuchMethodError: The getter 'surname' was called on null

NoSuchMethodError: The getter 'surname' was called on null

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

我尝试将 widget.data.surname 分配给 initState 中的随机 string 它清除了错误,但它没有重新分配 widget.data.surnamewidget.data.firstnamefromJson(reponse.data).surnamefromJson(response.data).firstname

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

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

_data = widget.data ?? Data();

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

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

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

我不确定你还用这些数据做了什么,但这应该有用:)