我使用SharedPreferences记住了用户名和密码,以在下次登录时不询问密码。当我使用USB电缆使用真实设备进行调试时,它运行良好。但是当我构建APK并安装它时,它无法在我的设备中运行。我不知道我在想什么。
我这样将数据保存在登录页面中
Future<Null> loginUser(isLogin, name, fac, year, gender) async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setString('Name', name);
prefs.setString('IsLogin', isLogin);
prefs.setString('Faculty', fac);
prefs.setString('Year', year);
prefs.setString('Gender', gender);
prefs.setString('Email', email);
print(prefs.getString('Faculty'));
}
我在主页上使用了此代码。...
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return NewMain();
}
}
class NewMain extends StatefulWidget {
@override
_NewMainState createState() => _NewMainState();
}
class _NewMainState extends State<NewMain> {
var name, fac, year, gender, email;
var goToLogin = true;
@override
void initState() {
// TODO: implement initState
checkRem();
super.initState();
}
@override
Widget build(BuildContext context) {
if (goToLogin)
return MaterialApp(
home: Login(),
);
else
return MaterialApp(
home: MainClass(name, fac, year, gender, email),
);
}
void checkRem() async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
if (prefs.getString('IsLogin') == 'Yes') {
goToLogin = false;
fac = prefs.getString('Faculty');
name = prefs.getString('Name');
gender = prefs.getString('Gender');
year = prefs.getString('Year');
email = prefs.getString('Email');
}
}
}
如果goToLogin为false,它将移至MainClass。 它在调试中运行完美。在内置的APK应用程序上无法正常运行。
已解决
这是我的IDE的问题。更新并修复
答案 0 :(得分:1)
问题是您调用checkRem()
中异步的initState()
,因此在完全执行checkRem()
之前调用build方法。
Soln:
在方法完全执行后用futureBuilder()
包裹或调用setState()