import 'package:flutter/material.dart';
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Consumer<AppThemeNotifier>(
builder: (BuildContext context, AppThemeNotifier value, Widget child) {
return Provider(
create: "XXXXXXX",
dispose: "XXXXXXX",
child: MaterialApp(
debugShowCheckedModeBanner: false,
theme: AppTheme.getThemeFromThemeMode(value.themeMode()),
home: Base()),
);
},
);
}
}
class Base extends StatefulWidget {
@override
_BaseState createState() => _BaseState();
}
class _BaseState extends State<Base> {
@override
Widget build(BuildContext context) {
return FutureBuilder<SessionAuth>(
future: Provider.of<AppThemeNotifier>(context, listen: false).validate,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
SessionAuth session = new SessionAuth();
if (session.userId != null && session.isLoggedIn) {
return FullApp();
} else if (isFirst) {
return OnBoardingScreen();
}
return LoginScreen();
} else {
return Scaffold(
body: Center(child: CircularProgressIndicator()),
);
}
},
);
}
}
我试图根据通过提供程序包完成的会话验证来导航不同的屏幕。(登录流程管理)
简单地说,我想根据会话详细信息替换屏幕
分解
- 如果
userId不等于 null 并且isLoggedin是true-> FullApp - 否则如果用户
isFirst是true-> OnBoardingScreen - 其他登录屏幕
错误
- 颤振:在 null 上调用了方法“>=”。
- 颤振:接收者:空
- 颤振:尝试调用:> =(0.0)
会话验证
class SessionAuth {
SessionAuth({this.isLoggedIn, this.userId, this.isFirst});
int userId;
bool isLoggedIn;
bool isFirst;
}
证实
Future<SessionAuth> get validate async {
SharedPreferences prefs = await SharedPreferences.getInstance();
SessionAuth auth = new SessionAuth();
auth.userId = prefs.getInt('userId') ?? null;
auth.isLoggedIn = prefs.getBool('isLoggedIn') ?? false;
auth.isFirst = prefs.getBool("isFirst") ?? null;
return auth;
}