這里有來自 MyApp 的代碼:
class MyApp extends StatefulWidget {
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
bool isLoggedIn = false;
@override
void initState() {
// TODO: implement initState
super.initState();
comprobarEstado();
}
Future<void> comprobarEstado() async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
isLoggedIn = ((prefs.getBool('logeado') == null) ? false : prefs.getBool('logeado'))!;
print ("Estado ${isLoggedIn}");
}
@override
Widget build(BuildContext context) {
return MaterialApp(
localizationsDelegates: context.localizationDelegates,
supportedLocales: context.supportedLocales,
locale: context.locale,
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: isLoggedIn ? MyHomePage() : LoginScreen());
}
}
如果 isLoggedIn 的值為 true,我想啟動 MyHomePage,如果它為 false,我想啟動 LoginPage。
isLoggedIn 的當前值為 true,但它總是啟動 LoginPage。
我想知道獲取 isLoggedIn 值并根據其值打開正確頁面的正確方法。
uj5u.com熱心網友回復:
comprobarEstado方法是,您的async小部件將在未來解決之前構建,并且一旦值更改,您就沒有代碼來觸發重建。一個簡單的解決方法是將您的方法更改為:
Future<void> comprobarEstado() async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
setState(() {
isLoggedIn = ((prefs.getBool('logeado') == null) ? false : prefs.getBool('logeado'))!;
});
print ("Estado ${isLoggedIn}");
}
呼叫setState將觸發小部件重建。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/489282.html
標籤:扑
