Created
June 15, 2022 11:39
-
-
Save ishaileshmishra/f0284e4cb8f420b5140cfdda2a80f880 to your computer and use it in GitHub Desktop.
Implementing Middleware For Flutter
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import 'package:flutter/material.dart'; | |
import 'package:get/get.dart'; | |
class GlobalMiddleware extends GetMiddleware { | |
final authController = Get.find<AuthController>(); | |
@override | |
RouteSettings redirect(String route) { | |
return authController.authenticated || route == '/login' | |
? null | |
: RouteSettings(name: '/login'); | |
} | |
@override | |
GetPage onPageCalled(GetPage page) { | |
print('>>> Page ${page.name} called'); | |
print('>>> User ${authController.username} logged'); | |
return authController.username != null | |
? page.copyWith(parameter: {'user': authController.username}) | |
: page; | |
} | |
@override | |
List<Bindings> onBindingsStart(List<Bindings> bindings) { | |
// This function will be called right before the Bindings are initialize, | |
// then bindings is null | |
bindings = [OtherBinding()]; | |
return bindings; | |
} | |
@override | |
GetPageBuilder onPageBuildStart(GetPageBuilder page) { | |
print('Bindings of ${page.toString()} are ready'); | |
return page; | |
} | |
@override | |
Widget onPageBuilt(Widget page) { | |
print('Widget ${page.toStringShort()} will be showed'); | |
return page; | |
} | |
@override | |
void onPageDispose() { | |
print('PageDisposed'); | |
} | |
} | |
void main() { | |
Get.put(AuthController()); | |
runApp(GetMaterialApp( | |
initialRoute: '/home', | |
getPages: [ | |
GetPage( | |
name: '/home', | |
page: () => HomePage(), | |
middlewares: [GlobalMiddleware()], | |
), | |
GetPage( | |
name: '/login', | |
page: () => LoginPage(), | |
binding: LoginBinding(), | |
middlewares: [GlobalMiddleware()], | |
), | |
], | |
)); | |
} | |
class AuthController extends GetxController { | |
final _authenticated = false.obs; | |
final _username = RxString(null); | |
bool get authenticated => _authenticated.value; | |
set authenticated(value) => _authenticated.value = value; | |
String get username => _username.value; | |
set username(value) => _username.value = value; | |
@override | |
void onInit() { | |
ever(_authenticated, (value) { | |
if (value) { | |
username = 'Eduardo'; | |
} | |
}); | |
super.onInit(); | |
} | |
} | |
class OtherBinding extends Bindings { | |
@override | |
void dependencies() { | |
Get.put(OtherController()); | |
} | |
} | |
class OtherController extends GetxController { | |
@override | |
void onInit() { | |
print('>>> OtherController started'); | |
super.onInit(); | |
} | |
} | |
class HomePage extends StatelessWidget { | |
@override | |
Widget build(BuildContext context) { | |
return Scaffold( | |
appBar: AppBar(title: Text('HOME')), | |
body: Center( | |
child: Text('User: ${Get.parameters['user']}'), | |
), | |
); | |
} | |
} | |
class LoginBinding extends Bindings { | |
@override | |
void dependencies() { | |
Get.put(AuthController()); | |
Get.put(LoginController()); | |
} | |
} | |
class LoginController extends GetxController { | |
@override | |
void onInit() { | |
print('>>> LoginController started'); | |
super.onInit(); | |
} | |
AuthController get authController => Get.find<AuthController>(); | |
} | |
class LoginPage extends GetView<LoginController> { | |
@override | |
Widget build(BuildContext context) { | |
return Scaffold( | |
appBar: AppBar(title: Text('Login')), | |
body: Center( | |
child: RaisedButton( | |
child: Text('Login'), | |
onPressed: () { | |
controller.authController.authenticated = true; | |
Get.offNamed('/home'); | |
}, | |
), | |
), | |
); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment