我使用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为假,它将移动到MainClass。 它在调试中完美运行。它不适用于构建的 apk 应用程序。
解决
这是我的 IDE 的问题。更新和修复
问题是你调用checkRem()
initState()
中是异步的,所以在完全执行checkRem()
之前调用构建方法。
索恩: 在方法完成执行后用futureBuilder()
或调用setState()
包装它