Navigation 2.0 – Routing On Flutter Web

Navigation 2.0 – Routing On Flutter Web

Tìm hiểu cách đồng bộ hóa URL web với các trang Flutter và xử lý điều hướng trên web bằng Flutter

Trong bài viết này, chúng ta sẽ tìm hiểu cách Navigation 2.0 hoạt động với Web Flutter, cách xây dựng các trang web và đồng bộ hóa URL với các dự án Flutter Web của chúng ta.

Trước đây, với các kỹ thuật điều hướng bắt buộc, chúng ta chỉ có thể push và pop các route trong stack điều hướng, nhưng điều đó không xử lý URL web và lịch sử web. Vì vậy, đội ngũ Flutter đã đưa ra kỹ thuật điều hướng khai báo mới này để xử lý các URL như một phần không thể thiếu của route management.

Hãy tìm hiểu các kỹ thuật khác nhau mà chúng ta có thể sử dụng để quản lý các Route và cách Navigation 2.0 làm cho nó tốt hơn.

1. Routing using OnGenerateRoute

Trước tiên, hãy bắt đầu với Routing bằng cách sử dụng onGenerateRoute. Nếu bạn thử điều hướng đến các trang khác nhau bằng cách sử dụngNavigator.push()đơn giản hoặc các phương pháp khác, trang sẽ thay đổi nhưng URL thì không. Ngoài ra, sẽ không có lịch sử (history, trang trước đó) nào được lưu lại.

Chúng ta có thể làm điều này bằng cách sử dụng Generate Routes.

onGenerateRouteslà lệnh callback của route generator được sử dụng khi ứng dụng được điều hướng đến một route đã đặt tên (named route). Khi sử dụng lệnh này, chúng ta sẽ tạo các route, điều hướng đến trang khác và đồng bộ hóa các thay đổi với URL của trình duyệt.

Chúng ta cần hai tệp route (cho code rõ ràng hơn hơn), một tệp để xác định tên route và tệp khác để xác địnhonGenerateRouteclass.

Tệproutes_namesẽ có các route với tên route tương ứng.

Ở đây, chúng ta có hai trang,FIRST_PAGE(Ví dụ: localhost: 3000 / # / first_page) vàSECOND_PAGE(Ví dụ: localhost: 3000 / # / second_page).

Bây giờ, chúng ta sẽ tạo mộtonGenerateRouteclass có thể tái sử dụng trong tệp route thứ hai của chúng ta.

Sử dụng route settings, chúng ta sẽ nhận được tên Route và sau đó điều hướng đến trang tương ứng. Ở đây, _GeneratePageRoutelà class mở rộng PageRouteBuilder. Nó được sử dụng để thêm các hoạt ảnh chuyển đổi điều hướng.

Việc thiết lập các route gần như đã hoàn thành. Bước cuối cùng là thêmgenerateRoutevào tệpmain.dartcủa chúng ta.

Bên trongMaterialApp, chúng ta sẽ thêm các route vàoonGenerateRouteproperty và đặt một initial route (Trang này sẽ được tải trước và route tương ứng sẽ là initial route được hiển thị trên URL). Bây giờ, bằng cách sử dụng builder property của ứng dụng material, chúng ta sẽ chèn các widget.HomePagelà một stateless widget, tạo inserted widget.

Chúng ta có hai trang cho hai route của chúng ta ( /first-page and /second-page). Để điều hướng từ trang này sang trang khác, chúng ta sẽ sử dụngNavigator.pushNamed(context, RouteName);

First Page:

Second Page:

Phần Router của chúng ta hiện đã hoàn thành.

Bây giờ, chúng ta hãy xem xét một phương pháp khác để thực hiện Routing trong Web Flutter bằng cách sử dụng Navigation 2.0.

2. Routing Flutter (Navigation 2.0)

Navigation 2.0 tuân theo cách tiếp cận khai báo. Sử dụng phương pháp này, chúng ta sẽ đồng bộ hóa URL web với dự án Flutter của chúng ta.

Hãy xem cách chúng ta có thể làm điều này.

Chúng ta sẽ sử dụng một constructor có tên làMaterialApp.router(). Nó tạo ra một ứng dụng material sử dụng router thay vì Navigator và yêu cầu hai thứ,routerDelegatevàrouterInformationParser.

URL typed sẽ chuyển quaRouterInformationParser và nó sẽ chuyển URL thành dữ liệu do người dùng định nghĩa (user defined data). Sau đó, nó sẽ được chuyển choRouterDelegate, phụ trách các state của ứng dụng router.

Trước tiên, hãy tạo kiểu dữ liệu chung của chúng ta, trong đó route sẽ được chuyển đổi thông quaRouteInformationParser.

Trong class trên, chúng ta có hai biến,pathName, sẽ là tham số URL (sau “/“) vàboolean, sẽ hiển thị ‘trang không xác định (unknown page)’ trong trường hợp URL không hợp lệ.

Ngoài ra, chúng ta đã tạo ra thêm một số named constructors.

home()hiển thị initial screen khi route là “/“. Trong trường hợp này, boolean không xác định sẽ là false và đường dẫn sẽ trống.otherPage()dành cho các trangpathName. Ví dụ. /xyz.unknown()dành cho các đường dẫn không xác định.

Sau đó, chúng ta sẽ tạoRouteInformationParserchuyển đổi URL thànhHomeRoutePathcủa chúng ta.

Chúng ta sẽ mở rộngRouterInformationParservới typeHomeRoutePathvà sau đó chúng ta sẽ overrideparseRouteInformationmethod để chịu trách nhiệm phân tích (parsing) cú pháp đường dẫn URL thànhHomeRoutePath.

Khi chúng ta không có phân đoạn đường dẫn (zero path segments) (pathSegements sau “/“ ví dụ/abc/xyz có 2 phân đoạn đường dẫn), chúng ta sẽ chuyển đổi thànhhome()type. Tương tự, chúng ta sẽ chuyển đổi sang các type khác tùy theo điều kiện.

Ngoài ra, chúng ta có một method khác để override, được gọi làrestoreRouteInformation. Method này sẽ lưu trữ lịch sử duyệt web trên trình duyệt. Ở đây, chúng ta đã chuyển đường dẫn đếnRouteInformationtheoHomeRoutePathstate.

Bây giờ chúng ta đã hoàn thànhinformationParser.

Hãy chuyển sangRouterDelegate.

Class này cần mở rộngRouterDelegatevới typeHomeRoutePat. Nó có 5 override method và chúng ta không cần phải xử lý tất cả chúng.addListenermethod vàremoveListenermethod, chúng ta có thể sử dụngChangeNotifiervà thêm nó vào function.

Ngoài ra đối vớipopRoute, chúng ta có thể sử dụng mixinPopNavigatorRouterDelegateMixin.

Ở đây, chúng ta đã xác định hai state mà chúng ta sẽ sử dụng để điều hướng đến các trang. Một làpathNamevà một là cho các trang lỗiisError.

Hãy bắt đầu với từng override method:

currentConfiguration: được gọi bởi [Router] khi nó phát hiện thông tin route có thể đã thay đổi do rebuild. Vì vậy, theo các điều kiện, chúng ta đang call cácHomePageRouteconstructors.setNewRoutePath: Phương thức này xử lý việc định tuyến khi người dùng nhập URL vào trình duyệt và nhấn enter.build: Trả về Navigator vớiHomePagecủa chúng ta theo mặc định và thay đổi state thông quaHomePagevà nếupathName không rỗng, chúng ta có thể map tên với các trang và hiển thị các trang khác nhau theo các route khác nhau (ở đây mình chỉ hiển thị một trang có tên route).

Bước cuối cùng là thêmrouterDelegatevàrouterInformationParser của chúng ta vàoMaterialApp.router()bên trongmain.dart.

Kết luận

Phương pháp liên quan đến Navigation 2.0 có quá nhiều code soạn sẵn để thêm vào nhưng nó xử lý các trường hợp bị bỏ sót trongonGenerateRoute. Bạn có thể nhận thấy rằng mũi tên chuyển tiếp trong trình duyệt có thể không hoạt động đúng với cách tiếp cận đầu tiên. Tuy nhiên, cách tiếp cận đầu tiên có phần dễ thực hiện và dễ quản lý hơn so với cách thứ hai.