当用户打开应用程序时,启动屏幕会打开。启动屏幕决定用户是要进入主页还是登录,使用GetX层的中间件。
此功能:
@override
RouteSettings? redirect(String? route) async{ // -> error
GetSignedInUserInfoRepoImp _sigenedInUser = GetSignedInUserInfoRepoImp();
if ( await _sigenedInUser.isUserSignedIn()) {
return const RouteSettings(name: Routes.HOME);
} else {
return const RouteSettings(name: Routes.SIGN_IN);
}
}
但是我不能将重定向函数与future函数一起使用。我该怎么办?
您应该在main()
构建函数中返回GetMaterialApp.router()
而不是GetMaterialApp()
,然后根据您的示例使用下面的代码片段:
@override
Future<GetNavConfig?> redirectDelegate(GetNavConfig route) async {
var _sigenedInUser = Get.find<GetSignedInUserInfoRepoImp>();
bool _isSignedIn = await _sigenedInUser.isUserSignedIn();
if (_isSignedIn) {
return Get.rootDelegate.toNamed('/home');
}else {
return Get.rootDelegate.toNamed('/sign_in');
}
return await super.redirectDelegate(route);
}
点击此处了解更多信息。
将GetSignedInUserInfoRepoImp
转换为GetxService
,并保持用户在此服务中的当前登录状态。根据登录/注销等更改登录状态
然后,从GetMiddleware
:查询服务
// SERVICE
class GetSignedInUserInfoRepoImp extends GetxService {
final isLoggedIn = false;
bool isUserSignedIn() {
return isLoggedIn;
}
}
// MIDDLEWARE
@override
RouteSettings? redirect(String? route) {
var _sigenedInUser = Get.find<GetSignedInUserInfoRepoImp>();
if (_sigenedInUser.isUserSignedIn()) {
return const RouteSettings(name: Routes.HOME);
} else {
return const RouteSettings(name: Routes.SIGN_IN);
}
}
通过Getx AppBinding 初始化此服务
// BINDING
class AppBinding implements Bindings {
@override
void dependencies() {
Get.put<GetSignedInUserInfoRepoImp>(GetSignedInUserInfoRepoImp());
}
}
// APP
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return GetMaterialApp(
initialBinding: AppBinding(),
home: Home(),
);
}
}
https://chornthorn.github.io/getx-docs/dependency-management/binding/
您可以使用redirectDelegate
:
@override
Future<GetNavConfig?> redirectDelegate(GetNavConfig route) async{
GetSignedInUserInfoRepoImp _sigenedInUser = GetSignedInUserInfoRepoImp();
if ( await _sigenedInUser.isUserSignedIn()) {
return const RouteSettings(name: Routes.HOME);
} else {
return const RouteSettings(name: Routes.SIGN_IN);
}
}