v7
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import '../router/app_router_delegate.dart';
|
||||
import 'app_navigation_rail.dart';
|
||||
import 'app_top_bar.dart';
|
||||
import 'app_top_bar/app_top_bar.dart';
|
||||
|
||||
class AppNavigation extends StatelessWidget {
|
||||
const AppNavigation({super.key});
|
||||
|
||||
@@ -41,7 +41,7 @@ class _AppNavigationRailState extends State<AppNavigationRail> {
|
||||
),
|
||||
tail: Padding(
|
||||
padding: const EdgeInsets.only(bottom: 6.0),
|
||||
child: Text('V0.0.5',style: TextStyle(color: Colors.white,fontSize: 12),),
|
||||
child: Text('V0.0.6',style: TextStyle(color: Colors.white,fontSize: 12),),
|
||||
),
|
||||
backgroundColor: const Color(0xff3975c6),
|
||||
onDestinationSelected: _onDestinationSelected,
|
||||
@@ -53,9 +53,9 @@ class _AppNavigationRailState extends State<AppNavigationRail> {
|
||||
|
||||
void _onDestinationSelected(int index) {
|
||||
if(index==1){
|
||||
router.changePath(kDestinationsPaths[index],keepAlive: true);
|
||||
router.setPathKeepLive(kDestinationsPaths[index]);
|
||||
}else{
|
||||
router.path = kDestinationsPaths[index];
|
||||
router.path=kDestinationsPaths[index];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
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 '../../router/app_router_delegate.dart';
|
||||
|
||||
class AppRouterEditor extends StatefulWidget {
|
||||
final ValueChanged<String>? onSubmit;
|
||||
@@ -1,7 +1,9 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:iroute/components/components.dart';
|
||||
import '../router/app_router_delegate.dart';
|
||||
import '../../router/app_router_delegate.dart';
|
||||
import 'app_router_editor.dart';
|
||||
import 'history_view_icon.dart';
|
||||
import 'route_history_button.dart';
|
||||
|
||||
class AppTopBar extends StatelessWidget {
|
||||
const AppTopBar({super.key});
|
||||
@@ -19,11 +21,15 @@ class AppTopBar extends StatelessWidget {
|
||||
Expanded(
|
||||
child: Row(children: [
|
||||
const Spacer(),
|
||||
RouteHistoryButton(),
|
||||
const SizedBox(width: 12,),
|
||||
SizedBox(
|
||||
width: 250,
|
||||
child: AppRouterEditor(
|
||||
onSubmit: (path) => router.path = path,
|
||||
)),
|
||||
const SizedBox(width: 12,),
|
||||
HistoryViewIcon(),
|
||||
const Padding(
|
||||
padding: EdgeInsets.symmetric(vertical: 12.0),
|
||||
child: VerticalDivider(
|
||||
156
lib/v6/app/navigation/views/app_top_bar/history_view_icon.dart
Normal file
156
lib/v6/app/navigation/views/app_top_bar/history_view_icon.dart
Normal file
@@ -0,0 +1,156 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:iroute/components/components.dart';
|
||||
import '../../router/app_router_delegate.dart';
|
||||
import '../../router/route_history.dart';
|
||||
import 'app_top_bar.dart';
|
||||
|
||||
class HistoryViewIcon extends StatelessWidget{
|
||||
const HistoryViewIcon({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
||||
return MouseRegion(
|
||||
cursor: SystemMouseCursors.click,
|
||||
child: PopPanel(
|
||||
offset: const Offset(0, 10),
|
||||
panel: SizedBox(
|
||||
height: 350,
|
||||
child: Column(
|
||||
children: [
|
||||
_buildTopBar(),
|
||||
const Expanded(
|
||||
child:HistoryPanel(),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
child: const Icon(
|
||||
Icons.history,
|
||||
size: 20,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildTopBar() {
|
||||
return Container(
|
||||
decoration: BoxDecoration(
|
||||
color: const Color(0xffFAFAFC),
|
||||
borderRadius: BorderRadius.circular(6),
|
||||
),
|
||||
padding:
|
||||
const EdgeInsets.only(top: 10, left: 12, right: 12, bottom: 8),
|
||||
child: Row(
|
||||
children: [
|
||||
const Text(
|
||||
'浏览历史',
|
||||
style: TextStyle(fontWeight: FontWeight.bold),
|
||||
),
|
||||
const Spacer(),
|
||||
TextButton(onPressed: router.clearHistory, child: const Text('清空历史'))
|
||||
],
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
class HistoryItem extends StatefulWidget {
|
||||
final RouteHistory history;
|
||||
final VoidCallback onPressed;
|
||||
final VoidCallback onDelete;
|
||||
|
||||
const HistoryItem({super.key, required this.history, required this.onPressed, required this.onDelete});
|
||||
|
||||
@override
|
||||
State<HistoryItem> createState() => _HistoryItemState();
|
||||
}
|
||||
|
||||
class _HistoryItemState extends State<HistoryItem> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return MouseRegion(
|
||||
cursor: SystemMouseCursors.click,
|
||||
child: GestureDetector(
|
||||
behavior: HitTestBehavior.opaque,
|
||||
onTap: widget.onPressed,
|
||||
child: Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(widget.history.path),
|
||||
const SizedBox(
|
||||
height: 2,
|
||||
),
|
||||
Text(kRouteLabelMap[widget.history.path]!),
|
||||
],
|
||||
)),
|
||||
GestureDetector(
|
||||
onTap: widget.onDelete,
|
||||
child: const Icon(
|
||||
Icons.close,
|
||||
size: 18,
|
||||
color: Color(0xff8E92A9),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class HistoryPanel extends StatefulWidget {
|
||||
const HistoryPanel({super.key});
|
||||
|
||||
@override
|
||||
State<HistoryPanel> createState() => _HistoryPanelState();
|
||||
}
|
||||
|
||||
class _HistoryPanelState extends State<HistoryPanel> {
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
router.addListener(_onChange);
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
router.removeListener(_onChange);
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
if(router.histories.isEmpty){
|
||||
return const Center(
|
||||
child: Text(
|
||||
'暂无浏览历史记录',
|
||||
style: TextStyle(fontSize: 14, color: Colors.grey),
|
||||
),
|
||||
);
|
||||
}
|
||||
return ListView.builder(
|
||||
padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 16),
|
||||
itemExtent: 46,
|
||||
itemCount: router.histories.length,
|
||||
itemBuilder: (_, index) =>
|
||||
HistoryItem(
|
||||
onDelete: (){
|
||||
int fixIndex = router.histories.length - 1 - index;
|
||||
router.closeHistory(fixIndex);
|
||||
},
|
||||
onPressed: (){
|
||||
router.toHistory(router.histories[index]);
|
||||
Navigator.of(context).pop();
|
||||
},
|
||||
history: router.histories[index]),
|
||||
);
|
||||
}
|
||||
|
||||
void _onChange() {
|
||||
setState(() {});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
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';
|
||||
|
||||
class RouteHistoryButton extends StatefulWidget {
|
||||
const RouteHistoryButton({super.key});
|
||||
|
||||
@override
|
||||
State<RouteHistoryButton> createState() => _RouteHistoryButtonState();
|
||||
}
|
||||
|
||||
class _RouteHistoryButtonState extends State<RouteHistoryButton> {
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
router.addListener(_onChange);
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
router.removeListener(_onChange);
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
bool hasHistory = router.hasHistory;
|
||||
bool hasBackHistory = router.hasBackHistory;
|
||||
Color activeColor = const Color(0xff9195AC);
|
||||
Color inActiveColor = const Color(0xffC7CAD5);
|
||||
Color historyColor = hasHistory?activeColor:inActiveColor;
|
||||
Color backHistoryColor = hasBackHistory?activeColor:inActiveColor;
|
||||
return Wrap(
|
||||
children: [
|
||||
HoverIconButton(
|
||||
size: 20,
|
||||
hoverColor: historyColor,
|
||||
defaultColor: historyColor,
|
||||
icon: CupertinoIcons.arrow_left_circle,
|
||||
onPressed: hasHistory?router.back:null,
|
||||
),
|
||||
const SizedBox(width: 8,),
|
||||
HoverIconButton(
|
||||
size: 20,
|
||||
hoverColor: backHistoryColor,
|
||||
defaultColor: backHistoryColor,
|
||||
icon: CupertinoIcons.arrow_right_circle,
|
||||
onPressed: hasBackHistory?router.revocation:null,
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
void _onChange() {
|
||||
setState(() {});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user