This commit is contained in:
toly
2023-12-10 15:25:12 +08:00
parent 2ceed8b9b5
commit 7b16b52761
86 changed files with 3635 additions and 930 deletions

View File

@@ -1,5 +1,4 @@
import 'package:flutter/material.dart';
import '../router/app_router_delegate.dart';
import 'app_navigation_rail.dart';
import 'app_top_bar/app_top_bar.dart';

View File

@@ -1,10 +1,6 @@
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:iroute/components/components.dart';
import 'package:provider/provider.dart';
import '../../../pages/sort/provider/state.dart';
import '../router/app_router_delegate.dart';
import '../router/iroute_config.dart';
import '../router/routes.dart';
class AppNavigationRail extends StatefulWidget {
const AppNavigationRail({super.key});
@@ -14,18 +10,14 @@ class AppNavigationRail extends StatefulWidget {
}
class _AppNavigationRailState extends State<AppNavigationRail> {
final List<MenuMeta> deskNavBarMenus = const [
MenuMeta(label: '颜色板', icon: Icons.color_lens_outlined, path: '/color'),
MenuMeta(label: '计数器', icon: Icons.add_chart, path: '/counter'),
MenuMeta(label: '排序', icon: Icons.sort, path: '/sort'),
MenuMeta(label: '我的', icon: Icons.person, path: '/user'),
MenuMeta(label: '设置', icon: Icons.settings, path: '/settings'),
];
@override
void initState() {
super.initState();
router.addListener(_onRouterChange);
}
@override
void dispose() {
router.removeListener(_onRouterChange);
super.dispose();
}
@override
Widget build(BuildContext context) {
@@ -39,7 +31,7 @@ class _AppNavigationRailState extends State<AppNavigationRail> {
tail: Padding(
padding: const EdgeInsets.only(bottom: 6.0),
child: Text(
'V0.0.11',
'V0.1.1',
style: TextStyle(color: Colors.white, fontSize: 12),
),
),
@@ -50,10 +42,10 @@ class _AppNavigationRailState extends State<AppNavigationRail> {
);
}
RegExp _segReg = RegExp(r'/app/\w+');
final RegExp _segReg = RegExp(r'/\w+');
int? get activeIndex {
String path = router.path;
final String path = GoRouterState.of(context).uri.toString();
RegExpMatch? match = _segReg.firstMatch(path);
if (match == null) return null;
String? target = match.group(0);
@@ -64,25 +56,10 @@ class _AppNavigationRailState extends State<AppNavigationRail> {
void _onDestinationSelected(int index) {
String path = deskNavBarMenus[index].path!;
if (index == 1) {
router.changePath(path, keepAlive: true,recordHistory: true);
return;
if(index==4){
GoRouter.of(context).push(path);
}else{
GoRouter.of(context).go(path);
}
if(index ==2){
SortState state = SortStateScope.read(context);
String name = state.config.name;
router.changePath('/app/sort/$name',recordHistory: true);
return;
}
if (index == 4) {
router.changePath(path, style: RouteStyle.push,recordHistory: true);
return;
} else {
router.changePath(path,recordHistory: true);
}
}
void _onRouterChange() {
setState(() {});
}
}

View File

@@ -1,7 +1,8 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:iroute/components/toly_ui/button/hover_icon_button.dart';
import '../../router/app_router_delegate.dart';
// import '../../router/app_router_delegate.dart';
class AppRouterEditor extends StatefulWidget {
final ValueChanged<String>? onSubmit;
@@ -14,23 +15,34 @@ class AppRouterEditor extends StatefulWidget {
class _AppRouterEditorState extends State<AppRouterEditor> {
final TextEditingController _controller = TextEditingController();
late GoRouterDelegate _delegate ;
@override
void initState() {
super.initState();
_delegate = GoRouter.of(context).routerDelegate;
_onRouteChange();
router.addListener(_onRouteChange);
_delegate.addListener(_onRouteChange);
}
void _onRouteChange() {
_controller.text=router.path;
List<RouteMatch> matches = _delegate.currentConfiguration.matches;
if(matches.isEmpty) return;
RouteMatch match = matches.last;
if(match is ImperativeRouteMatch){
_controller.text = match.matches.uri.toString();
}else{
_controller.text = match.matchedLocation;
}
}
@override
void dispose() {
_controller.dispose();
router.removeListener(_onRouteChange);
_delegate.removeListener(_onRouteChange);
super.dispose();
}

View File

@@ -1,13 +1,11 @@
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:iroute/components/components.dart';
import '../../../../pages/sort/provider/state.dart';
import '../../router/app_router_delegate.dart';
import '../../router/routes.dart';
import '../../router/utils/path_utils.dart';
import '../../router/views/route_back_indicator.dart';
import '../../helper/function.dart';
import '../route_back_indicator.dart';
import 'app_router_editor.dart';
import 'history_view_icon.dart';
import 'route_history_button.dart';
import 'history_view_icon.dart';
class AppTopBar extends StatelessWidget {
const AppTopBar({super.key});
@@ -16,31 +14,38 @@ class AppTopBar extends StatelessWidget {
Widget build(BuildContext context) {
return DragToMoveWrap(
child: Container(
alignment: Alignment.center,
// alignment: Alignment.center,
height: 46,
child: Row(
children: [
const SizedBox(width: 16),
const RouteBackIndicator(),
const RouterIndicator(),
// Spacer(),
Expanded(
child: Row(children: [
const Spacer(),
RouteHistoryButton(),
const SizedBox(width: 12,),
SizedBox(
width: 250,
child: AppRouterEditor(
onSubmit: (path) => router.changePath(path),
)),
const SizedBox(width: 12,),
HistoryViewIcon(),
child: Row(textDirection: TextDirection.rtl, children: [
const Padding(
padding: EdgeInsets.symmetric(vertical: 12.0),
child: VerticalDivider(
width: 32,
),
)
),
HistoryViewIcon(),
const SizedBox(
width: 12,
),
SizedBox(
width: 250,
child: AppRouterEditor(
onSubmit: (path) {
GoRouter.of(context).go(path);
// => router.changePath(path)
},
)),
const SizedBox(
width: 12,
),
RouteHistoryButton(),
])),
const WindowButtons()
],
@@ -57,27 +62,35 @@ class RouterIndicator extends StatefulWidget {
State<RouterIndicator> createState() => _RouterIndicatorState();
}
class _RouterIndicatorState extends State<RouterIndicator> {
late GoRouterDelegate _delegate;
@override
void initState() {
super.initState();
router.addListener(_onRouterChange);
_delegate = GoRouter.of(context).routerDelegate;
_delegate.addListener(_onRouterChange);
}
@override
void dispose() {
router.removeListener(_onRouterChange);
_delegate.removeListener(_onRouterChange);
super.dispose();
}
@override
Widget build(BuildContext context) {
List<RouteMatch> matches = _delegate.currentConfiguration.matches;
if(matches.isEmpty) return const SizedBox();
RouteMatch match = _delegate.currentConfiguration.matches.last;
print(
"=========_RouterIndicatorState:build==${match.matchedLocation}========");
return TolyBreadcrumb(
items: pathToBreadcrumbItems(router.path),
items: pathToBreadcrumbItems(context, match.matchedLocation),
onTapItem: (item) {
if (item.to != null) {
router.changePath(item.to!);
GoRouter.of(context).go(item.to!);
}
},
);
@@ -85,16 +98,10 @@ class _RouterIndicatorState extends State<RouterIndicator> {
void _onRouterChange() {
setState(() {});
if(router.path.startsWith('/app/sort/')){
SortState state = SortStateScope.of(context);
String name = router.path.replaceAll('/app/sort/', '');
if(name!='settings'){
state.selectName(name);
}
}
}
List<BreadcrumbItem> pathToBreadcrumbItems(String path) {
List<BreadcrumbItem> pathToBreadcrumbItems(
BuildContext context, String path) {
Uri uri = Uri.parse(path);
List<BreadcrumbItem> result = [];
String to = '';
@@ -106,16 +113,25 @@ class _RouterIndicatorState extends State<RouterIndicator> {
for (String segment in uri.pathSegments) {
to += '/$segment';
String label = '';
if(to.startsWith('/app/sort/')){
label = to.replaceAll('/app/sort/', '');
}else{
label = kRouteLabelMap[to] ?? '未知路由';
}
if(label.isNotEmpty){
result.add(BreadcrumbItem(to: to, label: label, active: to == distPath));
String label = calcRouteName(context, to);
if (label.isNotEmpty) {
result
.add(BreadcrumbItem(to: to, label: label, active: to == distPath));
}
}
return result;
}
}
Map<String, String> kRouteLabelMap = {
'': '',
'/color': '颜色板',
'/color/add': '添加颜色',
'/color/detail': '颜色详情',
'/counter': '计数器',
'/sort': '排序算法',
'/sort/player': '演示',
'/sort/settings': '排序配置',
'/user': '我的',
'/settings': '系统设置',
};

View File

@@ -1,8 +1,8 @@
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:iroute/components/components.dart';
import '../../router/app_router_delegate.dart';
import '../../router/routes.dart';
import '../../router/iroute_config.dart';
import 'package:iroute/v11/app/navigation/helper/function.dart';
import '../../helper/router_history.dart';
import 'app_top_bar.dart';
class HistoryViewIcon extends StatelessWidget{
@@ -10,6 +10,7 @@ class HistoryViewIcon extends StatelessWidget{
@override
Widget build(BuildContext context) {
RouterHistory routerHistory = RouterHistoryScope.read(context);
return MouseRegion(
cursor: SystemMouseCursors.click,
@@ -19,7 +20,7 @@ class HistoryViewIcon extends StatelessWidget{
height: 350,
child: Column(
children: [
_buildTopBar(),
_buildTopBar(routerHistory),
const Expanded(
child:HistoryPanel(),
),
@@ -34,7 +35,7 @@ class HistoryViewIcon extends StatelessWidget{
);
}
Widget _buildTopBar() {
Widget _buildTopBar( RouterHistory routerHistory) {
return Container(
decoration: BoxDecoration(
color: const Color(0xffFAFAFC),
@@ -49,14 +50,14 @@ class HistoryViewIcon extends StatelessWidget{
style: TextStyle(fontWeight: FontWeight.bold),
),
const Spacer(),
TextButton(onPressed: router.clearHistory, child: const Text('清空历史'))
TextButton(onPressed: routerHistory.clear, child: const Text('清空历史'))
],
));
}
}
class HistoryItem extends StatefulWidget {
final IRouteConfig history;
final RouteMatchList history;
final VoidCallback onPressed;
final VoidCallback onDelete;
@@ -69,6 +70,7 @@ class HistoryItem extends StatefulWidget {
class _HistoryItemState extends State<HistoryItem> {
@override
Widget build(BuildContext context) {
String path = widget.history.matches.last.matchedLocation;
return MouseRegion(
cursor: SystemMouseCursors.click,
child: GestureDetector(
@@ -80,11 +82,11 @@ class _HistoryItemState extends State<HistoryItem> {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(widget.history.path),
Text(path),
const SizedBox(
height: 2,
),
Text(kRouteLabelMap[widget.history.path]??'未知路由'),
Text(calcRouteName(context, path)),
],
)),
GestureDetector(
@@ -110,22 +112,18 @@ class HistoryPanel extends StatefulWidget {
}
class _HistoryPanelState extends State<HistoryPanel> {
late RouterHistory _history ;
@override
void initState() {
super.initState();
router.addListener(_onChange);
void didChangeDependencies() {
super.didChangeDependencies();
_history = RouterHistoryScope.of(context);
}
@override
void dispose() {
router.removeListener(_onChange);
super.dispose();
}
@override
Widget build(BuildContext context) {
List<IRouteConfig> histories = router.historyManager.histories;
List<RouteMatchList> histories = _history.histories.reversed.toList();
if(histories.isEmpty){
return const Center(
child: Text(
@@ -141,12 +139,12 @@ class _HistoryPanelState extends State<HistoryPanel> {
itemBuilder: (_, index) =>
HistoryItem(
onDelete: (){
int fixIndex = histories.length - 1 - index;
router.closeHistory(fixIndex);
_history.close(histories[index]);
},
onPressed: (){
router.changeRoute(histories[index].copyWith(recordHistory: false));
onPressed: ()async {
Navigator.of(context).pop();
_history.select(histories[index]);
// router.changeRoute(histories[index].copyWith(recordHistory: false));
},
history: histories[index]),
);

View File

@@ -1,7 +1,8 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:iroute/components/toly_ui/button/hover_icon_button.dart';
import '../../router/app_router_delegate.dart';
import '../../helper/router_history.dart';
class RouteHistoryButton extends StatefulWidget {
const RouteHistoryButton({super.key});
@@ -11,22 +12,19 @@ class RouteHistoryButton extends StatefulWidget {
}
class _RouteHistoryButtonState extends State<RouteHistoryButton> {
@override
void initState() {
super.initState();
router.addListener(_onChange);
}
late RouterHistory _history ;
@override
void dispose() {
router.removeListener(_onChange);
super.dispose();
void didChangeDependencies() {
super.didChangeDependencies();
_history = RouterHistoryScope.of(context);
}
@override
Widget build(BuildContext context) {
bool hasHistory = router.historyManager.hasHistory;
bool hasBackHistory = router.historyManager.hasBackHistory;
bool hasHistory = _history.hasHistory;
bool hasBackHistory = _history.hasBackHistory;
Color activeColor = const Color(0xff9195AC);
Color inActiveColor = const Color(0xffC7CAD5);
Color historyColor = hasHistory?activeColor:inActiveColor;
@@ -38,7 +36,7 @@ class _RouteHistoryButtonState extends State<RouteHistoryButton> {
hoverColor: historyColor,
defaultColor: historyColor,
icon: CupertinoIcons.arrow_left_circle,
onPressed: hasHistory?router.back:null,
onPressed: hasHistory?_history.back:null,
),
const SizedBox(width: 8,),
HoverIconButton(
@@ -46,13 +44,9 @@ class _RouteHistoryButtonState extends State<RouteHistoryButton> {
hoverColor: backHistoryColor,
defaultColor: backHistoryColor,
icon: CupertinoIcons.arrow_right_circle,
onPressed: hasBackHistory?router.revocation:null,
onPressed: hasBackHistory?_history.revocation:null,
),
],
);
}
void _onChange() {
setState(() {});
}
}

View File

@@ -0,0 +1,25 @@
import 'package:flutter/material.dart';
class NotFindPage extends StatelessWidget {
const NotFindPage({super.key});
@override
Widget build(BuildContext context) {
return const Material(
child: Center(
child: Wrap(
spacing: 16,
crossAxisAlignment: WrapCrossAlignment.center,
direction: Axis.vertical,
children: [
Icon(Icons.nearby_error,size: 64, color: Colors.redAccent),
Text(
'404 Page Not Find',
style: TextStyle(fontSize: 24, color: Colors.grey),
),
],
),
),
);
}
}

View File

@@ -0,0 +1,58 @@
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
class RouteBackIndicator extends StatefulWidget {
const RouteBackIndicator({super.key});
@override
State<RouteBackIndicator> createState() => _RouteBackIndicatorState();
}
class _RouteBackIndicatorState extends State<RouteBackIndicator> {
late GoRouterDelegate _delegate ;
@override
void initState() {
super.initState();
_delegate = GoRouter.of(context).routerDelegate;
_delegate.addListener(_onChange);
}
@override
void dispose() {
_delegate.removeListener(_onChange);
super.dispose();
}
@override
Widget build(BuildContext context) {
bool hasPush = _delegate.currentConfiguration.matches
.whereType<ImperativeRouteMatch>().isNotEmpty;
if(hasPush){
return MouseRegion(
cursor: SystemMouseCursors.click,
child: GestureDetector(
onTap: context.pop,
child: Container(
width: 26,
height: 26,
margin: EdgeInsets.only(right: 8),
alignment: Alignment.center,
decoration: BoxDecoration(
color: Color(0xffE3E5E7),
borderRadius: BorderRadius.circular(6)
),
child: Icon(Icons.arrow_back_ios_new,size: 14,)),
),
);
}
return SizedBox();
}
void _onChange() {
setState(() {
});
}
}