Skip to content

Instantly share code, notes, and snippets.

@eduardoflorence
Created February 24, 2021 11:35
Show Gist options
  • Save eduardoflorence/d87978406625a486422d23b77fcd9c16 to your computer and use it in GitHub Desktop.
Save eduardoflorence/d87978406625a486422d23b77fcd9c16 to your computer and use it in GitHub Desktop.
GetX - Sample GetMiddleware
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');
},
),
),
);
}
}
@eae1212
Copy link

eae1212 commented Aug 31, 2021

Hi, thanks a lot for such an excelent sample,
but I need help to understand how to use onPageCalled in middleware.

First, it is called before function "redirect" in middleware, right?

Second, In my case (flutter sdk: ">=2.7.0 <3.0.0" , get: 4.3.8) I obtain flutter error:

page.copyWith(parameter: {'user': authController.username})
The named parameter 'parameter' isn't defined.
Try correcting the name to an existing named parameter's name, or defining a named parameter with the name 'parameter'.

After correction parameter->arguments I obtain a runtime error:

type 'RouteSettings' is not a subtype of type 'GetPage'

How can I use this function correctly and pass some parameters to HomeView?

@godzyken
Copy link

godzyken commented Sep 7, 2021

Hi eae1212!

try to replace page.copyWith(parameter:{'user':authController.username}) with
page.copy(...)
it's work for me, hope it's help you too!!

@juanleon10
Copy link

thanks brother, it was very helpful

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment