有一个变量pinEnable
,它"告诉"应用程序用户是否为应用程序设置了pin。这存储在SharedPreferences
中。我的应用程序中的第一个页面依赖于它。由于获取操作是异步的,它只返回null
。
我使用的相关代码是:-
PinData
只是一个类,包含设置和获取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,因此它返回PinCodePage()
有没有办法解决这个问题,或者有什么办法绕过这个问题。谢谢
您不需要有状态的小部件,这是一个更好的解决方案,使用FutureBuilder
仅在异步进程完成时返回正确的小部件:
编辑:编辑代码以解决您没有在共享prefs 中设置初始值的事实
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
}
}
}
);
}
}