v7
This commit is contained in:
@@ -1,8 +1,17 @@
|
||||
import 'dart:async';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'iroute.dart';
|
||||
import '../../../pages/color/color_detail_page.dart';
|
||||
import '../../../pages/color/color_page.dart';
|
||||
import '../../../pages/empty/empty_page.dart';
|
||||
import '../../../pages/settings/settings_page.dart';
|
||||
import '../../../pages/counter/counter_page.dart';
|
||||
import '../../../pages/user/user_page.dart';
|
||||
import '../transition/fade_transition_page.dart';
|
||||
import '../../../pages/color/color_add_page.dart';
|
||||
import 'route_history.dart';
|
||||
|
||||
const List<String> kDestinationsPaths = [
|
||||
'/color',
|
||||
@@ -17,8 +26,65 @@ class AppRouterDelegate extends RouterDelegate<Object> with ChangeNotifier {
|
||||
String _path = '/color';
|
||||
|
||||
String get path => _path;
|
||||
|
||||
AppRouterDelegate() {
|
||||
// keepAlivePath.add('/color');
|
||||
_histories.add(RouteHistory(path));
|
||||
}
|
||||
|
||||
final List<RouteHistory> _histories = [];
|
||||
final List<RouteHistory> _backHistories = [];
|
||||
|
||||
List<RouteHistory> get histories => _histories.reversed.toList();
|
||||
|
||||
bool get hasHistory => _histories.length > 1;
|
||||
|
||||
bool get hasBackHistory => _backHistories.isNotEmpty;
|
||||
|
||||
/// 历史回退操作
|
||||
/// 将当前顶层移除,并加入 _backHistories 撤销列表
|
||||
/// 并转到前一路径
|
||||
void back() {
|
||||
if (!hasHistory) return;
|
||||
RouteHistory top = _histories.removeLast();
|
||||
_backHistories.add(top);
|
||||
if (_histories.isNotEmpty) {
|
||||
_path = _histories.last.path;
|
||||
if (_histories.last.extra != null) {
|
||||
_pathExtraMap[_path] = _histories.last.extra;
|
||||
}
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
|
||||
void toHistory(RouteHistory history) {
|
||||
_path = history.path;
|
||||
if (history.extra != null) {
|
||||
_pathExtraMap[_path] = history.extra;
|
||||
}
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
void closeHistory(int index) {
|
||||
_histories.removeAt(index);
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
void clearHistory() {
|
||||
_histories.clear();
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
/// 撤销回退操作
|
||||
/// 取出回退列表的最后元素,跳转到该路径
|
||||
void revocation() {
|
||||
RouteHistory target = _backHistories.removeLast();
|
||||
_path = target.path;
|
||||
if (target.extra != null) {
|
||||
_pathExtraMap[_path] = target.extra;
|
||||
}
|
||||
_histories.add(target);
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
int? get activeIndex {
|
||||
@@ -37,48 +103,58 @@ class AppRouterDelegate extends RouterDelegate<Object> with ChangeNotifier {
|
||||
|
||||
final List<String> keepAlivePath = [];
|
||||
|
||||
FutureOr<dynamic> changePath(String value,
|
||||
{bool forResult = false, Object? extra, bool keepAlive = false}) {
|
||||
if (forResult) {
|
||||
_completerMap[value] = Completer();
|
||||
}
|
||||
if (keepAlive) {
|
||||
if (keepAlivePath.contains(value)) {
|
||||
keepAlivePath.remove(value);
|
||||
}
|
||||
keepAlivePath.add(value);
|
||||
}
|
||||
if (extra != null) {
|
||||
_pathExtraMap[value] = extra;
|
||||
void setPathKeepLive(String value) {
|
||||
if (keepAlivePath.contains(value)) {
|
||||
keepAlivePath.remove(value);
|
||||
}
|
||||
keepAlivePath.add(value);
|
||||
path = value;
|
||||
if (forResult) {
|
||||
return _completerMap[value]!.future;
|
||||
}
|
||||
}
|
||||
|
||||
void setPathForData(String value, dynamic data) {
|
||||
_pathExtraMap[value] = data;
|
||||
path = value;
|
||||
}
|
||||
|
||||
Future<dynamic> changePathForResult(String value) async {
|
||||
Completer<dynamic> completer = Completer();
|
||||
_completerMap[value] = completer;
|
||||
path = value;
|
||||
return completer.future;
|
||||
}
|
||||
|
||||
set path(String value) {
|
||||
if (_path == value) return;
|
||||
_path = value;
|
||||
/// 将路由加入历史列表
|
||||
_addPathToHistory(value,_pathExtraMap[path]);
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
void _addPathToHistory(String value, Object? extra) {
|
||||
if (_histories.isNotEmpty && value == _histories.last.path) return;
|
||||
_histories.add(RouteHistory(
|
||||
value,
|
||||
extra: _pathExtraMap[path],
|
||||
));
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Navigator(
|
||||
onPopPage: _onPopPage,
|
||||
pages: _buildPages(context, path),
|
||||
pages: _buildPages(path),
|
||||
);
|
||||
}
|
||||
|
||||
List<Page> _buildPages(BuildContext context,String path) {
|
||||
List<Page> _buildPages(path) {
|
||||
List<Page> pages = [];
|
||||
List<Page> topPages = _buildPageByPath(context,path);
|
||||
List<Page> topPages = _buildPageByPath(path);
|
||||
|
||||
if (keepAlivePath.isNotEmpty) {
|
||||
for (String alivePath in keepAlivePath) {
|
||||
if (alivePath != path) {
|
||||
pages.addAll(_buildPageByPath(context,alivePath));
|
||||
pages.addAll(_buildPageByPath(alivePath));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -91,36 +167,64 @@ class AppRouterDelegate extends RouterDelegate<Object> with ChangeNotifier {
|
||||
return pages;
|
||||
}
|
||||
|
||||
Page? _buildPageByPathFromTree(BuildContext context, String path) {
|
||||
// 1. 根据 path 在 iroute 树中查询节点
|
||||
IRoute? iroute = root.match(path);
|
||||
Object? extra = _pathExtraMap[path];
|
||||
bool keepAlive = keepAlivePath.contains(path);
|
||||
bool forResult = _completerMap.containsKey(path);
|
||||
Page? page;
|
||||
if (iroute != null) {
|
||||
page = iroute.builder?.call(
|
||||
context,
|
||||
IRouteData(
|
||||
uri: Uri.parse(path),
|
||||
extra: extra,
|
||||
keepAlive: keepAlive,
|
||||
forResult: forResult,
|
||||
),
|
||||
);
|
||||
List<Page> _buildPageByPath(String path) {
|
||||
Widget? child;
|
||||
if (path.startsWith('/color')) {
|
||||
return buildColorPages(path);
|
||||
}
|
||||
return page;
|
||||
|
||||
if (path == kDestinationsPaths[1]) {
|
||||
child = const CounterPage();
|
||||
}
|
||||
if (path == kDestinationsPaths[2]) {
|
||||
child = const UserPage();
|
||||
}
|
||||
if (path == kDestinationsPaths[3]) {
|
||||
child = const SettingPage();
|
||||
}
|
||||
return [
|
||||
FadeTransitionPage(
|
||||
key: ValueKey(path),
|
||||
child: child ?? const EmptyPage(),
|
||||
)
|
||||
];
|
||||
}
|
||||
|
||||
List<Page> _buildPageByPath(BuildContext context,String path) {
|
||||
List<Page> buildColorPages(String path) {
|
||||
List<Page> result = [];
|
||||
Uri uri = Uri.parse(path);
|
||||
String dist = '';
|
||||
for (String segment in uri.pathSegments) {
|
||||
dist += '/$segment';
|
||||
Page? page = _buildPageByPathFromTree(context,dist);
|
||||
if(page!=null){
|
||||
result.add(page);
|
||||
if (segment == 'color') {
|
||||
result.add(const FadeTransitionPage(
|
||||
key: ValueKey('/color'),
|
||||
child: ColorPage(),
|
||||
));
|
||||
}
|
||||
if (segment == 'detail') {
|
||||
final Map<String, String> queryParams = uri.queryParameters;
|
||||
String? selectedColor = queryParams['color'];
|
||||
if (selectedColor != null) {
|
||||
Color color = Color(int.parse(selectedColor, radix: 16));
|
||||
result.add(FadeTransitionPage(
|
||||
key: const ValueKey('/color/detail'),
|
||||
child: ColorDetailPage(color: color),
|
||||
));
|
||||
} else {
|
||||
Color? selectedColor = _pathExtraMap[path];
|
||||
if (selectedColor != null) {
|
||||
result.add(FadeTransitionPage(
|
||||
key: const ValueKey('/color/detail'),
|
||||
child: ColorDetailPage(color: selectedColor),
|
||||
));
|
||||
_pathExtraMap.remove(path);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (segment == 'add') {
|
||||
result.add(const FadeTransitionPage(
|
||||
key: ValueKey('/color/add'),
|
||||
child: ColorAddPage(),
|
||||
));
|
||||
}
|
||||
}
|
||||
return result;
|
||||
|
||||
Reference in New Issue
Block a user