根据存储在共享首选项中的记住我状态导航到屏幕

Posted

技术标签:

【中文标题】根据存储在共享首选项中的记住我状态导航到屏幕【英文标题】: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(),));

         ,
        )

    );
  

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

【问题讨论】:

【参考方案1】:

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

我建议查看docs 关于FutureBuilder 和Widget 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

以上是关于根据存储在共享首选项中的记住我状态导航到屏幕的主要内容,如果未能解决你的问题,请参考以下文章

在导致空指针的活动中使用共享首选项,这让我起了作用

如何保存和获取存储在共享首选项中的包名称?

共享首选项存储在哪里?

将 Web 服务数据存储到共享首选项

如何将对象列表中的布尔收藏夹保存到 Flutter 中的共享首选项

将 JWT 令牌存储在共享首选项中?并在整个应用程序中检索价值?