屏幕抖动条件渲染

时间:2020-05-22 02:27:11

标签: flutter authentication dart

我正在尝试在应用打开时实现有条件的显示。

在main.dart中

return Materialapp(
  ...
  home: WelcomePage()
  ...
);

在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);
  }
}

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

这段代码可以满足我的需求,但可以满足我的需求。 我想要的是,如果用户在应用程序中没有保存的首选项,则该应用程序将不会显示WelcomePage screen,而是有一个代码检查该应用程序将显示Login screen还是{{1 }}。

更新

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

main.dart

WelcomePage screen

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

2 个答案:

答案 0 :(得分:3)

因此,根据我的理解,您正在尝试确保在启动屏幕后,如果用户退出共享首选项,则该用户将被重定向到相应的页面。 因此,您可以做的是将isLoggedin方法放入初始屏幕页面中... 少打字.. 查看示例代码。 所以计时器是启动画面应持续多长时间

@override
  void initState() {
    super.initState();
    loadData();
  }

  Future<Timer> loadData() async {
    return new Timer(Duration(seconds: 5), isLoggedin());
  }

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

因此,在初始屏幕页面中,您可以执行此操作... 添加一个计时器,并在计时器完成后执行以检查用户

答案 1 :(得分:2)

您可以在username中检查main(),然后使用initialRoute决定要转到哪个页面
这样您就不会每次

都去WelcomePage screen
initialRoute: username == null ? "/welcome" : "/login",

代码段

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(),
      },
    );
  }
}