Files
iroute/lib/13/01___/route/parser.dart
toly 75690361b3 10
2023-10-12 08:13:08 +08:00

123 lines
3.2 KiB
Dart

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:iroute/common/pages/stl_color_page.dart';
import 'package:path_to_regexp/path_to_regexp.dart';
import '../pages/app.dart';
import '../pages/home_page.dart';
import '../pages/color_add_page.dart';
import 'parsed_route.dart';
import 'route_state.dart';
class AppRouteParser extends RouteInformationParser<ParsedRoute> {
@override
Future<ParsedRoute> parseRouteInformation(
RouteInformation routeInformation) async {
print("=======parseRouteInformation:${routeInformation.uri.path}===================");
final uri = routeInformation.uri;
final path = uri.toString();
final queryParams = uri.queryParameters;
return ParsedRoute(path, queryParams);
}
@override
RouteInformation? restoreRouteInformation(ParsedRoute configuration) {
print("=======restoreRouteInformation:${configuration}===================");
return RouteInformation(uri: Uri.parse(configuration.path));
}
}
class AppRouterDelegate extends RouterDelegate<ParsedRoute>
with ChangeNotifier, PopNavigatorRouterDelegateMixin {
AppRouterDelegate({String initial = '/'}) {
_routes.add(ParsedRoute(initial, {}));
}
final List<ParsedRoute> _routes = [];
@override
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
@override
ParsedRoute get currentConfiguration {
return _routes.last;
}
Future<void> go(String route) async {
ParsedRoute _route = await parser.parseRouteInformation(RouteInformation(uri: Uri.parse(route)));
if(_route!=_routes.last){
_routes.add(_route);
}
notifyListeners();
}
final _addColorKey = const ValueKey('addColor');
final _colorDetailKey = const ValueKey('ColorDetail');
@override
Widget build(BuildContext context) {
List<Page> pages = [];
for (ParsedRoute route in _routes) {
Page? page = _buildPageByPath(route);
if(page!=null){
pages.add(page);
}
}
return Navigator(
key: navigatorKey,
pages: pages,
onPopPage: _onPagePop,
);
}
Page? _buildPageByPath(ParsedRoute route) {
if(route.path == '/'){
return MaterialPage(child: HomePage());
}
if(route.path.startsWith('/color/detail')){
String? selectedColor = route.queryParameters['color'];
if (selectedColor != null) {
Color color = Color(int.parse(selectedColor, radix: 16));
return MaterialPage(key: _colorDetailKey, child: StlColorPage(color: color));
}
}
if (route.path == '/color/add') {
return MaterialPage(key: _addColorKey, child: ColorAddPage());
}
return null;
}
@override
Future<void> setNewRoutePath(ParsedRoute configuration) async {
print("===setNewRoutePath===${configuration}=================");
if(configuration!=_routes.last){
_routes.add(configuration);
}
}
bool _onPagePop(Route route, result) {
RouteSettings settings = route.settings;
if(settings is Page){
if(settings.key==_addColorKey){
_routes.removeLast();
notifyListeners();
}
if(settings.key==_colorDetailKey){
_routes.removeLast();
notifyListeners();
}
}
return route.didPop(result);
}
}