【问题标题】:Navigate to screen based on remember me status stored in shared preference in flutter根据存储在共享首选项中的记住我状态导航到屏幕
【发布时间】:2020-07-19 06:53:09
【问题描述】:

我正在开发一个简单的带有颤振的安卓应用程序。当用户登录时,如果记住我复选框为真,那么用户应该导航到仪表板屏幕。为此,在main.dart 文件中,我编写了这样的未来构建器代码。

class  MyApp extends StatelessWidget {
static String remember;
Future<String> _loadWidget() async
{
  SharedPreferences preferences=await SharedPreferences.getInstance();
  remember = preferences.getString("keep_login");
        return remember;
}


  @override
  Widget build(BuildContext context) {


    return MaterialApp(
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        //primaryColor: Color.fromRGBO(12, 127, 164, 1),
        primaryColor: Color.fromRGBO(2, 136, 209, 1),
        accentColor: Colors.white,

      ),
      onGenerateRoute: Router().generateRoute,
      home:  FutureBuilder(
        future: _loadWidget(),
        builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
           if (snapshot.hasData) {
             if(snapshot.data == null)
             {
               return SignIn();
             }
             else
             {
               return snapshot.data == "no" ? SignIn() : Dashboard();
             }

           }

             return snapshot.data == null ? SignIn() : Scaffold(body: Center(child: CircularProgressIndicator(),));

         },
        )

    );
  }
}

现在,当我打开应用程序时,会显示几秒钟我的登录页面,然后呈现仪表板。如何克服这个问题,一旦我弹出仪表板屏幕应用程序没有关闭,而是出现黑屏。我是不是在某种程度上错了。请帮我解决这个问题。

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    您需要检查FutureBuilder中的ConnectionStateAsyncSnapshot 有一个连接状态来通知您未来是否已完成、处于活动状态或什至可能导致错误。

    我建议查看docs 关于FutureBuilderWidget of the Week video,他们可以快速解决此连接状态。

    snapshot.hasDatasnapshot.data == null 完全相同。

    builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
      if (snapshot.connectionState == ConnectionState.done) {
        if(snapshot.data == null) {
          return SignIn();
        } else {
          return snapshot.data == "no" ? SignIn() : Dashboard();
        }
      }
      return Scaffold(body: Center(child: CircularProgressIndicator(),));
    },
    

    【讨论】:

    • 你拯救了我的一天!..我是新来的颤振,你能简要介绍一下那个连接状态是什么。
    • 我在弹出仪表板屏幕时出现黑屏。我该怎么办? @dumazy
    • 我添加了更多解释和官方文档链接。对于弹出时的黑屏,我认为这是另一个问题,可能与onGenerateRoute有关。看看那里,也许先尝试删除onGenerateRoute。如果你仍然卡住,我建议在一个单独的问题中解决这个问题
    【解决方案2】:

    我认为问题出在您的builder Future 函数中。您等待数据然后决定是显示SignIn 页面还是仪表板。这是正确的。但是在那个时候,未来没有数据你也显示SignIn页面。

    我相信这一行总是显示登录页面,而不是进度指示器,因为那里的数据总是空的。

    return snapshot.data == null ? SignIn() : Scaffold(body: Center(child: CircularProgressIndicator(),));
    

    试试下面的代码:

    builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
      if (snapshot.hasData) {
        if(snapshot.data == null) {
          return SignIn();
        } else {
          return snapshot.data == "no" ? SignIn() : Dashboard();
        }
      }
        return Scaffold(body: Center(child: CircularProgressIndicator(),));
    },
    

    【讨论】:

    • 我试过了,但是当共享首选项没有数据时,进度条会继续加载,并且不会呈现屏幕。 @Manuel
    猜你喜欢
    • 2020-05-12
    • 2018-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-05
    • 1970-01-01
    相关资源
    最近更新 更多