android - Flutter:根据情况调用不同的页面(登录或未登录的用户)
问题描述
我的应用程序有问题。
情况是:我在应用程序上有一个非常简单的登录系统,我使用 SharedPreferences 保存登录的用户。但是,如果用户离开应用程序然后返回,它将再次打开登录屏幕,所以如果用户已登录,我想跳过登录屏幕。
因此,在我的主要功能中,我放置了一个函数来检查是否有登录信息,如果有,它将直接重定向到应用程序页面,如果没有,则重定向到登录页面。但是当我尝试调用应用程序页面时,它总是调用在主页部分设置的页面。
我该如何解决这个问题?有什么办法让它忽略主页吗?有没有办法在家里制作“如果”部分?将是更好的解决方案,但这是不可能的。
我也知道我没有使用最好的方法来制作这个控件,但它可以工作(尽管我现在有这个问题,当然),如果你有任何让它变得更好的提示,我将不胜感激。
这是我的代码:
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
void main() => runApp(new MyApp());
class _MyAppState extends State<MyApp> {
Future<void> verificaLogin() async {
print("running ok"); //just to test if the function runs
final prefs = await SharedPreferences.getInstance();
final key = 'usuario';
final value = prefs.getString(key);
print('saved tester $value');
String usu = value; /
if (usu.isEmpty) {
BuildContext context;
Navigator.push(
context,
MaterialPageRoute(builder: (context) => LoginScreen()), //sends to loginscreen if not logged
);
}
if (usu.isNotEmpty) {
BuildContext context;
Navigator.of(context)
.pushReplacement(MaterialPageRoute(builder: (context) => Pedidos())); //sends to main (not main.dart) app page
}
}
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) => verificaLogin());
}
Widget build(BuildContext context) {
return BotToastInit(
child: MaterialApp(
navigatorObservers: [BotToastNavigatorObserver()],
title: "Test App",
theme: ThemeData(
primarySwatch: Colors.green,
),
debugShowCheckedModeBanner: false,
home: LoginScreen(), //i'm calling the loginscreen, it ignores the function on the top
),
);
}
}
解决方案
请制作一个像下面这样的 SplashScreen 它可以解决您的问题..
并将其称为 home: SplashScreen(),
class SplashScreen extends StatefulWidget {
@override
_SplashScreenState createState() => _SplashScreenState();
}
class _SplashScreenState extends State<SplashScreen> {
String loginData = "";
SharedPreferences sharedPreferences;
void initState() {
super.initState();
readFromStorage();
}
void readFromStorage() async {
sharedPreferences = await SharedPreferences.getInstance();
final key = 'usuario';
loginData = sharedPreferences.getString(key);
if (loginData.isNotEmpty) {
Future.delayed(const Duration(milliseconds: 3000), () {
setState(() {
Navigator.of(context)
.pushReplacement(MaterialPageRoute(builder: (context) => Pedidos()));
});
});
} else {
Future.delayed(const Duration(milliseconds: 3000), () {
setState(() {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => LoginScreen()),);
});
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
FlutterLogo(
size: 100.0,
),
],
)),
);
}
}
推荐阅读
- sql-server - 如何监控 SQL Server 中的表结构变化?
- mysql - ORDER BY 另一个表的行数
- javascript - 在同一域请求中获取 JavaScript 错误“Access-Control-Allow-Origin”
- python - ipython 内核在我的 Windows 10 笔记本电脑上新安装的 anaconda3 的 spyder 中不起作用。它显示错误
- jquery - 如何将 .css() 方法与数组一起使用?
- typescript - 获取 keyof 类吸气剂或获取非吸气剂?
- gradle - 为什么依赖项在 gradle 中排除无效
- selenium - 我有一个用例,我需要在测试结束后保持量角器会话以及浏览器实例处于活动状态。有没有办法这样做?
- javascript - 避免浏览器中出现空的本地存储条目
- python - isinstance() 和 np.issubdtype() 有什么区别?