getx重定向中间件作为未来的功能



当用户打开应用程序时,启动屏幕会打开。启动屏幕决定用户是要进入主页还是登录,使用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);
}
}

最新更新