9
This commit is contained in:
153
lib/13/02/route/parser.dart
Normal file
153
lib/13/02/route/parser.dart
Normal file
@@ -0,0 +1,153 @@
|
||||
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/home_page.dart';
|
||||
import '../pages/color_add_page.dart';
|
||||
import '../store/app_state.dart';
|
||||
import 'parsed_route.dart';
|
||||
import 'route_state.dart';
|
||||
|
||||
class AppRouteParser extends RouteInformationParser<ParsedRoute> {
|
||||
final List<String> allowPaths;
|
||||
final ParsedRoute initialRoute;
|
||||
|
||||
AppRouteParser({
|
||||
required this.allowPaths,
|
||||
String initialRoute = '/',
|
||||
}) : initialRoute = ParsedRoute(initialRoute, initialRoute, {}, {});
|
||||
|
||||
@override
|
||||
Future<ParsedRoute> parseRouteInformation(
|
||||
RouteInformation routeInformation) async {
|
||||
print(
|
||||
"=======parseRouteInformation:${routeInformation.uri.path}===================");
|
||||
|
||||
final uri = routeInformation.uri;
|
||||
final path = uri.toString();
|
||||
final queryParams = uri.queryParameters;
|
||||
|
||||
ParsedRoute parsedRoute = initialRoute;
|
||||
|
||||
for (var pathTemplate in allowPaths) {
|
||||
final parameters = <String>[];
|
||||
var pathRegExp = pathToRegExp(pathTemplate, parameters: parameters);
|
||||
if (pathRegExp.hasMatch(path)) {
|
||||
final match = pathRegExp.matchAsPrefix(path);
|
||||
if (match == null) continue;
|
||||
final params = extract(parameters, match);
|
||||
parsedRoute = ParsedRoute(path, pathTemplate, params, queryParams);
|
||||
}
|
||||
}
|
||||
return parsedRoute;
|
||||
}
|
||||
|
||||
@override
|
||||
RouteInformation? restoreRouteInformation(ParsedRoute configuration) {
|
||||
print("=======restoreRouteInformation:${configuration}===================");
|
||||
|
||||
return RouteInformation(uri: Uri.parse(configuration.path));
|
||||
}
|
||||
}
|
||||
|
||||
class RootRouterDelegate extends RouterDelegate<ParsedRoute>
|
||||
with ChangeNotifier, PopNavigatorRouterDelegateMixin {
|
||||
final RouteState routeState;
|
||||
|
||||
RootRouterDelegate(this.routeState) {
|
||||
routeState.addListener(notifyListeners);
|
||||
}
|
||||
|
||||
@override
|
||||
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
|
||||
|
||||
@override
|
||||
ParsedRoute get currentConfiguration {
|
||||
print("=======currentConfiguration:${routeState.route.path}===================");
|
||||
|
||||
return routeState.route;
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
routeState.removeListener(notifyListeners);
|
||||
routeState.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
final _addColorKey = const ValueKey('addColor');
|
||||
final _detailColorKey = const ValueKey('detailColor');
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final routeState = RouteStateScope.of(context);
|
||||
List<Page> pages = [];
|
||||
final String pathTemplate = routeState.route.pathTemplate;
|
||||
|
||||
pages.add(MaterialPage(child: HomePage()));
|
||||
|
||||
String? selectedColor;
|
||||
|
||||
if (pathTemplate == '/color/detail/:colorHex') {
|
||||
selectedColor = routeState.route.parameters['colorHex'];
|
||||
}
|
||||
|
||||
if (selectedColor != null) {
|
||||
int value = int.parse(
|
||||
selectedColor.substring(
|
||||
1,
|
||||
),
|
||||
radix: 16);
|
||||
pages.add(MaterialPage(
|
||||
key: _detailColorKey,
|
||||
child: StlColorPage(
|
||||
color: Color(value),
|
||||
)));
|
||||
}
|
||||
|
||||
bool isAddPage = pathTemplate == '/color/add';
|
||||
if (isAddPage) {
|
||||
pages.add(
|
||||
MaterialPage(key: _addColorKey, child: ColorAddPage()),
|
||||
);
|
||||
}
|
||||
print("===build====================");
|
||||
return Navigator(
|
||||
key: navigatorKey,
|
||||
pages: pages,
|
||||
onPopPage: (route, result) {
|
||||
print(result);
|
||||
if (route.settings is Page &&
|
||||
(route.settings as Page).key == _addColorKey) {
|
||||
if(result is Color){
|
||||
AppStateScope.of(context).addColor(result);
|
||||
}
|
||||
routeState.update('/color');
|
||||
}
|
||||
|
||||
if (route.settings is Page &&
|
||||
(route.settings as Page).key == _detailColorKey) {
|
||||
routeState.update('/color');
|
||||
}
|
||||
// appState.selectedBook = null;
|
||||
// notifyListeners();
|
||||
return route.didPop(result);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
/// 格式: /a /b
|
||||
|
||||
@override
|
||||
Future<void> setNewRoutePath(ParsedRoute configuration) async {
|
||||
print("===setNewRoutePath===${configuration}=================");
|
||||
routeState.route = configuration;
|
||||
return;
|
||||
}
|
||||
|
||||
// @override
|
||||
// Future<void> setInitialRoutePath( configuration) async{
|
||||
// _pages = [_pageMap['/']!];
|
||||
// notifyListeners();
|
||||
// }
|
||||
}
|
||||
Reference in New Issue
Block a user