154 lines
4.3 KiB
Dart
154 lines
4.3 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/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();
|
|
// }
|
|
}
|