如何解决Flutter:使用共享首选项时对 null 的方法调用
我想使用共享首选项来保持用户登录,并且我正在使用带有 provider 的 api。 我试图把它放在 main 中,但我不知道该怎么做,因为我有两个不同的页面,所以我在第一页中使用了它,但我发现了另一个错误
[错误:flutter/lib/ui/ui_dart_state.cc(177)] 未处理的异常: NoSuchMethodError: 方法 'login' 在 null 上被调用。 E/颤振 ( 4199):接收器:空
这是我使用的方法
UserProvider userProvider;
ServiceProvider serviceProvider;
bool alive = true;
bool isLoading = false;
var page;
@override
initState() {
init();
super.initState();
}
init() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
bool language = prefs.getBool('language');
bool type = prefs.getBool('type');
bool login = prefs.getBool('islog');
if (alive) {
if (language == true && type == true && login == true) {
signIn();
} else if ((language == true && type == false && login == true)) {
visitor();
}
} else {
if (alive) {
setState(() {
isLoading = false;
});
}
}
}
signIn() async {
//var res = await userProvider.residentLogin(context,phone,pass);
SharedPreferences prefs = await SharedPreferences.getInstance();
var phone = prefs.getString('phone');
String pass = prefs.getString("pass");
bool type = prefs.getBool('type');
print("Shared ***************resident********************************");
await userProvider.residentLogin(context,pass);
await serviceProvider.getHomeServiceList(context);
await serviceProvider.getAdsList(context);
await serviceProvider.getVideosList(context);
Navigator.pushReplacement(context,MaterialPageRoute(builder: (context) => ResidentBottomTab()));
print('Hello Tourist !!');
}
visitor() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
var phone = prefs.getString('phone');
String pass = prefs.getString("pass");
await userProvider.login(context,pass);
await serviceProvider.getVisitorAdsList(context);
await serviceProvider.getVisitorVideosList(context);
bool type = prefs.getBool('type');
print("Shared ******************visitor*****************************");
if (alive) {
Navigator.pushReplacement(
context,MaterialPageRoute(builder: (context) => VisitorHome()));
print('Hello Tourist !!');
}
}
@override
void dispose() {
alive = false;
super.dispose();
}
登录方式
Future<VisitorLoginModel> login(BuildContext context,pass) async {
final Map<String,dynamic> body = {
'phone': phone,'password': pass,'token': '123','serial_number': '123','lang': 'en','os': 'android',};
_isLoading = true;
notifyListeners();
print('Starting request');
http.Response response = await http.post(Environment.userLogin,body: json.encode(body),headers: Environment.requestHeader);
print('Completed request');
print('user SignUp response : ${response.body}');
//print(body.toString());
Map<String,dynamic> res = json.decode(response.body);
var results;
if (res['status'] == 1) {
// login successful
_visitorLoginModel = parseVisitorLogin(response.body);
Provider.of<LoginVisitorUserProvider>(context,listen: false).userData =
visitorLoginModel;
Provider.of<LoginVisitorUserProvider>(context,listen: false)
.sessionToken = visitorLoginModel.data.token;
headers = Provider.of<LoginVisitorUserProvider>(context,listen: false)
.httpHeader;
// print('token');
print('this is session token' +
Provider.of<LoginVisitorUserProvider>(context,listen: false)
.sessionToken);
} else {
// login failed;
results =
FailedRequest(code: 401,message: res['massage'],status: false);
}
_isLoading = false;
notifyListeners();
return visitorLoginModel;
}
所以任何人都有解决这个案例的想法!
解决方法
方法调用 await userProvider.login(context,phone,pass);
是在未初始化的变量上完成的。 UserProvider userProvider;
已声明但未初始化
这里的问题是 userProvider
正在声明但未初始化,serviceProvider
也是如此
在 Flutter 中,任何未初始化的变量都会隐式赋值为 null
因此,在您调用 await userProvider.login(context,pass);
方法的 login
行中,userProvider 不仅被初始化
要解决此问题,请执行以下操作, 在 initState 中,
userProvider = Provider.of<UserProvider>(context,listen: false);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。