Routes

Middleware

Route middleware is used to check if route exists or not, and show the page accordingly.

As of now we have middleware.dart file in routes directory

import 'package:flutter/material.dart';
import './routes.dart';
import '../views/pages/not_found.dart';

Route<dynamic>? routeMiddleware(RouteSettings route) {
  if (!routes.containsKey(route.name)) {
    return NotFoundPage.route();
  }
  return routes[route.name]!();
}

If you're not using the whole downloaded repository and you are using few modules only, then to use routeMiddleware in your app, you need to assign routeMiddleware to onGenerateRoute.

MaterialApp(
  ...
  onGenerateRoute: routeMiddleware,
  ...
);

if you need central permission handler then you can implement it in middleware. check below example:

import 'package:flutter/material.dart';
import 'package:example/models/user.dart';
import 'package:example/routes/routes.dart';
import 'package:example/view/pages/not_found.dart';
import 'package:example/view/pages/permission_denied.dart';

Route<dynamic>? routeMiddleware(RouteSettings route) {
  if (!routes.containsKey(route.name)) {
    return NotFoundPage.route();
  }
  if (!User.hasPermission('can-access-${route.name}')) {
    return PermissionDeniedPage.route();
  }
  return routes[route.name]!();
}

The same thing can be implemented in each page individually (in their route methods, check the example below). So permission will be checked everytime when we push the route. Also, please keep above note in mind.

home.dart

class DetailsPage extends StatefulWidget {
  static const String routeName = '/details';

  static Route<void> route() {
    if (!User.hasPermission('can-access-details-page')) {
      return PermissionDenied.route();
    }
    return MaterialPageRoute(
      settings: const RouteSettings(name: '/details'),
      builder: (_) => const DetailsPage(),
    );
  }

...

Copyright © 2024