上的 Flutter 多个条件将成为使用共享首选项的主屏幕

Flutter multiple conditions on witch is going to be home screen using Shared Prefs

我有一个登录屏幕,在用户登录后他会进入工作屏幕,如果用户已登录并且他离开应用程序并返回我做到了所以主屏幕是工作屏幕使用共享首选项,但现在我有另一个屏幕 是停止工作屏幕,我正在做的是用户进入此工作屏幕并开始工作,当他在工作屏幕上按下开始工作时,它会将他导航到停止工作屏幕并且有一个停止工作的按钮 将导航他到工作屏幕。我现在需要的是,如果用户按下开始在工作屏幕上工作并离开应用程序,我希望主屏幕成为停止工作屏幕而不是工作屏幕。因此,如果用户已登录并且他正在工作(按下开始工作按钮),那么我希望停止工作屏幕成为主屏幕。任何帮助将不胜感激。此外,当用户按下停止工作并退出应用程序时,它应该将他发送到工作屏幕而不是停止工作屏幕

// Start Working button
                           ElevatedButton(
                              child: loading
                                  ? const Loading()
                                  : const Text(
                                      'Start Working',
                                      style: TextStyle(fontSize: 20),
                                    ),
                              style: ElevatedButton.styleFrom(
                                  primary: Colors.teal),
                              onPressed: () async {
                                SharedPreferences prefs =
                                    await SharedPreferences.getInstance();

// End Work Button

                   ElevatedButton(
                    onPressed: () {
                      putEndWork();
                      Navigator.pushReplacement(
                        context,
                        MaterialPageRoute(
                          builder: (context) => const WorkingScreen(),
                        ),
                      );
                    },
                    child: const Text(
                      'End Work',

// main.dart

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  SharedPreferences prefs = await SharedPreferences.getInstance();
  var authorization = prefs.getString('authorization');
  runApp(
    MaterialApp(
      debugShowCheckedModeBanner: false,
      home: authorization == null ? const LoginScreen() : const WorkingScreen(),
    ),
  );
}

向 Shared Prefs 添加另一个变量,例如 isWorkingisWorking 在按下“开始工作按钮”时设置为 true,在按下“结束工作按钮”时设置为 false。

您的主要方法还应检索共享首选项中的 isWorking 变量。

然后将主要方法更改为:

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  SharedPreferences prefs = await SharedPreferences.getInstance();
  var authorization = prefs.getString('authorization');
  bool? isWorking = prefs.getBool('isWorking');
  var screenToShow = WorkingScreen();
  if (authorization == null) {
      var screenToShow = LoginScreen();
  } else if (isWorking!) {
      var screenToShow = StopWorkingScreen();
  }
  runApp(
    MaterialApp(
      debugShowCheckedModeBanner: false,
      home: screenToShow,
    ),
  );
}

BJW 回答的总体思路应该可行。

我希望重新声明 var screenToShow 的部分会引起问题:

  var screenToShow = WorkingScreen();
  if (authorization == null) {
      var screenToShow = LoginScreen();
  } else if (isWorking!) {
      var screenToShow = StopWorkingScreen();
  }

尝试使用相同的策略来帮助您:

Widget getScreenFromIsWorking([String? isWorking]) {
  if (isWorking != null) {
    return StopWorkingScreen();
  }
  return WorkingScreen();
}

主要调用如下:

var screenToShow = authorization == null ? LoginScreen() : getScreenFromIsWorking(isWorking);