NoSuchMethodError: The getter 'surname' was called on null
NoSuchMethodError: The getter 'surname' was called on null
我是 运行 具有自定义 BaaS
的 login
流程。提交按钮运行一个 onPressed
方法检查 Response response;
if reponse.statusCode == 200
然后发送 fromJson(reponse.data).surname
和 fromJson(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.surname
和widget.data.firstname
到 fromJson(reponse.data).surname
和 fromJson(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));
我不确定你还用这些数据做了什么,但这应该有用:)
我是 运行 具有自定义 BaaS
的 login
流程。提交按钮运行一个 onPressed
方法检查 Response response;
if reponse.statusCode == 200
然后发送 fromJson(reponse.data).surname
和 fromJson(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.surname
和widget.data.firstname
到 fromJson(reponse.data).surname
和 fromJson(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));
我不确定你还用这些数据做了什么,但这应该有用:)