Flutter 屏幕条件渲染

Emj*_*y23 2 authentication dart flutter

我试图在应用程序打开时实现屏幕的有条件显示。

在main.dart中

return Materialapp(
  ...
  home: WelcomePage()
  ...
);
Run Code Online (Sandbox Code Playgroud)

在WelcomePage.dart中

isLoggedin() async {
  prefs = await SharedPreferences.getInstance();
  if (prefs.getString('username') == null) {
    Navigator.of(context).pushAndRemoveUntil(
      MaterialPageRoute(builder: (BuildContext context) => LoginPage()),
      (Route<dynamic> route) => false);
  }
}
Run Code Online (Sandbox Code Playgroud)

问题: - 用户将打开应用程序,在启动屏幕后,将WelcomePage screen立即显示 ,然后将用户重定向到Login screen

这段代码满足了我的需要,也是我真正想要的。我想要的是,WelcomePage screen如果用户在应用程序中没有保存的首选项,应用程序将不会显示 ,而是有一段代码检查应用程序是否会显示Login screenWelcomePage screen

更新

首先,我真的很感谢给出的答案。这两者都有帮助,但我认为另一个答案就是我正在考虑的答案。但我这样做是这样的:

主程序.dart

Future main() async {
  WidgetsFlutterBinding.ensureInitialized();

  SharedPreferences prefs = await SharedPreferences.getInstance();

  _username = prefs.getString("username");
  ...
} 

return Materialapp(
  ...
  home: _username == null ? LoginPage() : WelcomePage()
  ...
);
Run Code Online (Sandbox Code Playgroud)

我不认为这是否是正确的方法之一。任何意见/建议将不胜感激。

chu*_*han 5

您可以签usernamemain()并使用initialRoute来决定要转到哪个页面,这样您就不会每次都
WelcomePage screen

initialRoute: username == null ? "/welcome" : "/login",
Run Code Online (Sandbox Code Playgroud)

代码片段

String username;

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();

  SharedPreferences prefs = await SharedPreferences.getInstance();

  username = await prefs.getString("username");   
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      initialRoute: username == null ? "/welcome" : "/login",
      routes: {
        '/login': (context) => LoginPage(
              title: "demo",
            ),
        "/welcome": (context) => WelcomePage(),
      },
    );
  }
}
Run Code Online (Sandbox Code Playgroud)