启动时 SharedPreference 值为空

SharedPreference value null on startup

有一个变量pinEnable告诉应用程序用户是否已经为应用程序设置了pin。这存储在 SharedPreferences 中。我的应用程序中出现的第一页取决于它。由于获取操作是异步的,它只是 returns null.

给出了我使用的相关代码:-

PinData 只是一个 class 包含设置和获取 pinpinEnable

的函数
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
            }
          }
        }
    );
  }
}