openplanning

Xử lý lỗi 404 trong Flutter GetX

  1. Cài đặt thư viện
  2. Xử lý 404 với unknownRoute
  3. Xử lý lỗi 404 với Middleware
Trong bài viết này chúng ta sẽ thảo luận về cách xử lý lỗi 404 trên nền tảng Web cho Flutter GetX.
Về cơ bản, GetMaterialApp của GetX hỗ trợ thuộc tính unknownRoute để bạn chỉ định một tuyến đường (Route) mà ứng dụng sẽ chuyển hướng đến nếu trang mà người dùng yêu cầu không tồn tại.
GetMaterialApp( 
  ... 
  unknownRoute: GetPage(
    name: "/page-not-found",
    page: () => const Custom404Page(),
  ), 
  ...
);
Chú ý: unknownRoute chỉ hoạt động nếu một trong các điều kiện sau được thoả mãn:
Giá trị của "initialRoute" phải khác "/".
GetMaterialApp( 
  ... 
  initialRoute: "/dashboard", // <----
  unknownRoute: GetPage(
    name: "/page-not-found",
    page: () => const Custom404Page(),
  ), 
  ...
);
Thuộc tính "home" được chỉ định một giá trị khác null.
GetMaterialApp( 
  ... 
  home: DashboardPage(), // <----
  unknownRoute: GetPage(
    name: "/page-not-found",
    page: () => const Custom404Page(),
  ), 
  ...
);
Trong trường hợp thuộc tính "home"null"initialRoute""/" bạn cần phải sử dụng Middleware để xử lý lỗi 404.

1. Cài đặt thư viện

pubspec.yaml
dependencies: 
  get: ^5.0.0-release-candidate-9.1

2. Xử lý 404 với unknownRoute

Trước hết hãy một ví dụ dưới đây, chúng ta sẽ chạy nó và xem điều gì sẽ xẩy ra khi người dùng truy cập vào một trang không tồn tại:
main_ex1.dart
import 'package:flutter/material.dart';
import 'package:get/get.dart';

import 'about_page.dart';
import 'dashboard_page.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
      title: 'Flutter GetX Demo', 
      debugShowCheckedModeBanner: false,
      // IMPORTANT: "initialRoute" must be different than "/"
      // or "home" is not null
      initialRoute: "/dashboard",
      getPages: [
        GetPage(
          name: "/dashboard",
          page: () => const DashboardPage(),
        ),
        GetPage(
          name: "/about",
          page: () => const AboutPage(),
        ),
      ],
    );
  }
}
Khi người dùng truy cập vào một trang không tồn tại ứng dụng sẽ chuyển hướng tới trang "/404" mặc định của Flutter, trang này hầu như trống rỗng.
Sửa lại ví dụ trên một chút chúng ta thêm vào thuộc tính "unknownRoute" để chỉ định một trang cụ thể mà ứng dụng sẽ chuyển hướng tới nếu lỗi 404 xẩy ra.
main_ex1b.dart (*)
GetMaterialApp(
  title: 'Flutter Demo',
  debugShowCheckedModeBanner: false, 
  // IMPORTANT: "initialRoute" must be different than "/"
  // or "home" is not null
  initialRoute: "/dashboard",
  unknownRoute: GetPage( // <--------------
    name: "/page-not-found",  
    page: () => const Custom404Page(),
  ),
  getPages: [
    GetPage(
      name: "/dashboard",
      page: () => const DashboardPage(),
    ),
    GetPage(
      name: "/about",
      page: () => const AboutPage(),
    ),
  ],
);
Lúc này nếu lỗi 404 xẩy ra ứng dụng sẽ chuyển hướng tới Custom404Page:

3. Xử lý lỗi 404 với Middleware

Điều gì sẽ xẩy ra nếu "initialRoute""/""home"null? Hãy xem ví dụ sau:
main_ex2.dart
import 'package:flutter/material.dart';
import 'package:get/get.dart';

import 'about_page.dart';
import 'custom_404_page.dart';
import 'dashboard_page.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
      title: 'Flutter Demo',
      debugShowCheckedModeBanner: false,
      initialRoute: "/", // <---------------
      getPages: [
        GetPage(
          name: "/", // <-------------------
          page: () => const DashboardPage(),
        ),
        GetPage(
          name: "/dashboard",
          page: () => const DashboardPage(),
        ),
        GetPage(
          name: "/about",
          page: () => const AboutPage(),
        ),
      ],
    );
  }
}
Trong trường hợp này, nếu người dùng nhập vào một đường dẫn không tồn tại ứng dụng sẽ hiển thị nội dung của trang mặc định và không có sự chuyển hướng nào xẩy ra.
Thuộc tính "unknownRoute" cũng sẽ không hoạt động:
return GetMaterialApp( 
  ...
  initialRoute: "/", // <--------------- 
  unknownRoute: GetPage( // --> Not working!!
    name: "/page-not-found",
    page: () => const Custom404Page(),
  ), 
  ...
);
Để xử lý lỗi 404 trong trường họp này chúng ta cần sử dụng Middleware.
main_ex2b.dart (*)
GetMaterialApp(
  title: 'Flutter Demo',
  debugShowCheckedModeBanner: false,
  initialRoute: "/", // <-------------------
  getPages: [
    GetPage(
      name: "/", // <-----------------------
      page: () => const DashboardPage(),
      middlewares: [
        DefaultPathMiddleware(), // <--------
      ],
    ),
    GetPage(
      name: "/page-not-found",
      page: () => const Custom404Page(),
    ),
    GetPage(
      name: "/dashboard",
      page: () => const DashboardPage(),
    ),
    GetPage(
      name: "/about",
      page: () => const AboutPage(),
    ),
  ],
);
default_path_middleware.dart
import 'dart:async';

import 'package:get/get.dart';

class DefaultPathMiddleware extends GetMiddleware {
  @override
  FutureOr<RouteDecoder?> redirectDelegate(RouteDecoder route) async {
    print("Route: $route");
    String? routePath = route.pageSettings?.path;
    print("Current Route Path: $routePath");
    // Route not found:
    if (routePath == '/wrong-path1') {
      // Redirect
      return RouteDecoder.fromRoute("/correct-path1");
    } else if (routePath == '/wrong-path2') {
      // Redirect
      return RouteDecoder.fromRoute("/correct-path2");
    } else if (routePath != '/') {
      // Redirect
      return RouteDecoder.fromRoute("/page-not-found");
    }
    // Other cases:
    return super.redirectDelegate(route);
  }
}
Các bài viết và ví dụ có liên quan tới GetX Middleware:
  • Hướng dẫn và ví dụ Flutter Getx middleware

Các hướng dẫn lập trình Flutter

Show More