SharedPreferences 不适用于真实设备 FLUTTER
SharedPreferences not working on real device FLUTTER
我使用 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 有问题。更新并修复
问题是你调用了 checkRem()
,它在 initState()
中是异步的,所以构建方法在 checkRem()
.
完成执行之前被调用
索恩:
用 futureBuilder()
包装它或在方法
完成执行后调用 setState()
我使用 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 有问题。更新并修复
问题是你调用了 checkRem()
,它在 initState()
中是异步的,所以构建方法在 checkRem()
.
索恩:
用 futureBuilder()
包装它或在方法
setState()