启动时 SharedPreference 值为空
SharedPreference value null on startup
有一个变量pinEnable
告诉应用程序用户是否已经为应用程序设置了pin。这存储在 SharedPreferences
中。我的应用程序中出现的第一页取决于它。由于获取操作是异步的,它只是 returns null
.
给出了我使用的相关代码:-
PinData
只是一个 class 包含设置和获取 pin
和 pinEnable
的函数
void main() => runApp(MyApp());
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
bool pinEnable;
PinData pinData = PinData();
updatePinEnable() async {
pinEnable = await pinData.getPinEnable();
print(pinEnable);
}
@override
void initState() {
super.initState();
updatePinEnable();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(...),
home: pinEnable == false ? MyTabbedHome() : PinCodePage());
}
}
在最后的代码语句中 pinEnable
不是 false 而是 null,因此 returns PinCodePage()
有什么方法可以解决这个问题,或者有什么办法可以解决这个问题。谢谢!!
您不需要有状态的小部件
,这是一个更好的解决方案,仅在异步过程完成时使用 FutureBuilder
到 return 正确的小部件:
编辑: 编辑了代码以解决您没有在共享首选项中设置初始值的问题
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
PinData pinData = PinData();
Future<bool> isPinEnabled() async => pinData.getPinEnable();
@override
Widget build(BuildContext context) {
return FutureBuilder<bool>(
future: isPinEnabled(),
builder: (BuildContext context, AsyncSnapshot<bool> snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return CircularProgressIndicator();
}
else if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.hasData) {
return snapshot.data ?
PinScreen() //if true returned from shared prefs go to pin screen
:
HomeScreen(); //if false returned from shared prefs go to home screen
}
else {
return HomeScreen(); //if null returned from shared prefs go to home screen
}
}
}
);
}
}
有一个变量pinEnable
告诉应用程序用户是否已经为应用程序设置了pin。这存储在 SharedPreferences
中。我的应用程序中出现的第一页取决于它。由于获取操作是异步的,它只是 returns null
.
给出了我使用的相关代码:-
PinData
只是一个 class 包含设置和获取 pin
和 pinEnable
void main() => runApp(MyApp());
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
bool pinEnable;
PinData pinData = PinData();
updatePinEnable() async {
pinEnable = await pinData.getPinEnable();
print(pinEnable);
}
@override
void initState() {
super.initState();
updatePinEnable();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(...),
home: pinEnable == false ? MyTabbedHome() : PinCodePage());
}
}
在最后的代码语句中 pinEnable
不是 false 而是 null,因此 returns PinCodePage()
有什么方法可以解决这个问题,或者有什么办法可以解决这个问题。谢谢!!
您不需要有状态的小部件
,这是一个更好的解决方案,仅在异步过程完成时使用 FutureBuilder
到 return 正确的小部件:
编辑: 编辑了代码以解决您没有在共享首选项中设置初始值的问题
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
PinData pinData = PinData();
Future<bool> isPinEnabled() async => pinData.getPinEnable();
@override
Widget build(BuildContext context) {
return FutureBuilder<bool>(
future: isPinEnabled(),
builder: (BuildContext context, AsyncSnapshot<bool> snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return CircularProgressIndicator();
}
else if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.hasData) {
return snapshot.data ?
PinScreen() //if true returned from shared prefs go to pin screen
:
HomeScreen(); //if false returned from shared prefs go to home screen
}
else {
return HomeScreen(); //if null returned from shared prefs go to home screen
}
}
}
);
}
}