。
This commit is contained in:
@@ -1,5 +1,4 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:window_manager/window_manager.dart';
|
|
||||||
import 'pages/app/app.dart';
|
import 'pages/app/app.dart';
|
||||||
import 'pages/app/app_router_delegate.dart';
|
import 'pages/app/app_router_delegate.dart';
|
||||||
|
|
||||||
|
|||||||
@@ -1,210 +0,0 @@
|
|||||||
import 'dart:async';
|
|
||||||
import 'dart:io';
|
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:iroute/13/04/app/navigation/router/iroute.dart';
|
|
||||||
import 'package:iroute/common/pages/stl_color_page.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/sort/sort_page.dart';
|
|
||||||
import '../../../pages/user/user_page.dart';
|
|
||||||
import '../../../transition/fade_transition_page.dart';
|
|
||||||
import '../../../pages/color/color_add_page.dart';
|
|
||||||
|
|
||||||
const List<String> kDestinationsPaths = [
|
|
||||||
'/color',
|
|
||||||
'/counter',
|
|
||||||
'/user',
|
|
||||||
'/settings',
|
|
||||||
];
|
|
||||||
|
|
||||||
AppRouterDelegate router = AppRouterDelegate();
|
|
||||||
|
|
||||||
class AppRouterDelegate extends RouterDelegate<Object> with ChangeNotifier {
|
|
||||||
String _path = '/color';
|
|
||||||
|
|
||||||
String get path => _path;
|
|
||||||
|
|
||||||
int? get activeIndex {
|
|
||||||
if(path.startsWith('/color')) return 0;
|
|
||||||
if(path.startsWith('/counter')) return 1;
|
|
||||||
if(path.startsWith('/user')) return 2;
|
|
||||||
if(path.startsWith('/settings')) return 3;
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
final Map<String,Completer<dynamic>> _completerMap = {};
|
|
||||||
|
|
||||||
Completer<dynamic>? completer;
|
|
||||||
|
|
||||||
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;
|
|
||||||
notifyListeners();
|
|
||||||
}
|
|
||||||
|
|
||||||
// IRoute? parserPath(String path){
|
|
||||||
//
|
|
||||||
// List<String> parts = path.split('/');
|
|
||||||
// String lever1 = '/${parts[1]}';
|
|
||||||
// List<IRoute> iRoutes = kDestinationsIRoutes.where((e) => e.path == lever1).toList();
|
|
||||||
//
|
|
||||||
// int counter = 2;
|
|
||||||
//
|
|
||||||
// IRoute? result;
|
|
||||||
// String check = lever1;
|
|
||||||
// for(int i = 0;i<iRoutes.length;i++){
|
|
||||||
// check = check +"/" + parts[counter];
|
|
||||||
// String path = iRoutes[i].path;
|
|
||||||
// if(path == check){
|
|
||||||
// result = iRoutes[i];
|
|
||||||
// break;
|
|
||||||
// }
|
|
||||||
// // String path =
|
|
||||||
// // result.children.add(IRoute(path: parts[i]);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Navigator(
|
|
||||||
onPopPage: _onPopPage,
|
|
||||||
pages: _buildPageByPath(path),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
List<Page> _buildPageByPath(String path) {
|
|
||||||
if(path.startsWith('/color')){
|
|
||||||
return buildColorPages(path);
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget? child;
|
|
||||||
if (path == kDestinationsPaths[1]) {
|
|
||||||
child = const CounterPage();
|
|
||||||
}
|
|
||||||
if (path == kDestinationsPaths[2]) {
|
|
||||||
child = const SortPage();
|
|
||||||
}
|
|
||||||
if (path == kDestinationsPaths[3]) {
|
|
||||||
child = const SettingPage();
|
|
||||||
}
|
|
||||||
return [
|
|
||||||
FadeTransitionPage(
|
|
||||||
key: ValueKey(path),
|
|
||||||
child: child ?? const EmptyPage(),
|
|
||||||
)
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
List<Page> buildColorPages(String path){
|
|
||||||
List<Page> result = [];
|
|
||||||
Uri uri = Uri.parse(path);
|
|
||||||
for (String segment in uri.pathSegments) {
|
|
||||||
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),
|
|
||||||
));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(segment == 'add'){
|
|
||||||
result.add( const FadeTransitionPage(
|
|
||||||
key: ValueKey('/color/add'),
|
|
||||||
child:ColorAddPage(),
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<bool> popRoute() async {
|
|
||||||
print('=======popRoute=========');
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool _onPopPage(Route route, result) {
|
|
||||||
if(_completerMap.containsKey(path)){
|
|
||||||
_completerMap[path]?.complete(result);
|
|
||||||
_completerMap.remove(path);
|
|
||||||
}
|
|
||||||
|
|
||||||
path = backPath(path);
|
|
||||||
return route.didPop(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
String backPath(String path){
|
|
||||||
Uri uri = Uri.parse(path);
|
|
||||||
if(uri.pathSegments.length==1) return path;
|
|
||||||
List<String> parts = List.of(uri.pathSegments)..removeLast();
|
|
||||||
return '/${parts.join('/')}';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<void> setNewRoutePath(configuration) async {}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// class AppRouterDelegate extends RouterDelegate<String> with ChangeNotifier, PopNavigatorRouterDelegateMixin {
|
|
||||||
//
|
|
||||||
// List<String> _value = ['/'];
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// List<String> get value => _value;
|
|
||||||
//
|
|
||||||
// set value(List<String> value){
|
|
||||||
// _value = value;
|
|
||||||
// notifyListeners();
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// @override
|
|
||||||
// Widget build(BuildContext context) {
|
|
||||||
// return Navigator(
|
|
||||||
// onPopPage: _onPopPage,
|
|
||||||
// pages: _value.map((e) => _pageMap[e]!).toList(),
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// final Map<String, Page> _pageMap = const {
|
|
||||||
// '/': MaterialPage(child: HomePage()),
|
|
||||||
// 'a': MaterialPage(child: PageA()),
|
|
||||||
// 'b': MaterialPage(child: PageB()),
|
|
||||||
// 'c': MaterialPage(child: PageC()),
|
|
||||||
// };
|
|
||||||
//
|
|
||||||
// bool _onPopPage(Route route, result) {
|
|
||||||
// _value = List.of(_value)..removeLast();
|
|
||||||
// notifyListeners();
|
|
||||||
// return route.didPop(result);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// @override
|
|
||||||
// GlobalKey<NavigatorState>? navigatorKey = GlobalKey<NavigatorState>();
|
|
||||||
//
|
|
||||||
// @override
|
|
||||||
// Future<void> setNewRoutePath(String configuration) async{
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
class IRoute {
|
|
||||||
final String path;
|
|
||||||
final List<IRoute> children;
|
|
||||||
|
|
||||||
const IRoute({required this.path, this.children = const []});
|
|
||||||
|
|
||||||
@override
|
|
||||||
String toString() {
|
|
||||||
return 'IRoute{path: $path, children: $children}';
|
|
||||||
}
|
|
||||||
|
|
||||||
List<String> list(){
|
|
||||||
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const List<IRoute> kDestinationsIRoutes = [
|
|
||||||
IRoute(
|
|
||||||
path: '/color',
|
|
||||||
children: [
|
|
||||||
IRoute(path: '/color/add'),
|
|
||||||
IRoute(path: '/color/detail'),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
IRoute(
|
|
||||||
path: '/counter',
|
|
||||||
),
|
|
||||||
IRoute(
|
|
||||||
path: '/user',
|
|
||||||
),
|
|
||||||
IRoute(
|
|
||||||
path: '/settings',
|
|
||||||
),
|
|
||||||
];
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import '../router/app_router_delegate.dart';
|
|
||||||
import 'app_navigation_rail.dart';
|
|
||||||
import 'background.dart';
|
|
||||||
import 'top_bar.dart';
|
|
||||||
|
|
||||||
class AppNavigation extends StatelessWidget {
|
|
||||||
const AppNavigation({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Scaffold(
|
|
||||||
body: Stack(
|
|
||||||
children: [
|
|
||||||
// const Background(),
|
|
||||||
Row(
|
|
||||||
children: [
|
|
||||||
const AppNavigationRail(),
|
|
||||||
Expanded(
|
|
||||||
child: Column(
|
|
||||||
children: [
|
|
||||||
TopBar(),
|
|
||||||
Divider(height: 1,),
|
|
||||||
Expanded(
|
|
||||||
child: Router(
|
|
||||||
routerDelegate: router,
|
|
||||||
backButtonDispatcher: RootBackButtonDispatcher(),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import '../../../components/tolyui/navigation/toly_navigation_rail.dart';
|
|
||||||
import '../router/app_router_delegate.dart';
|
|
||||||
|
|
||||||
class AppNavigationRail extends StatefulWidget {
|
|
||||||
const AppNavigationRail({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
State<AppNavigationRail> createState() => _AppNavigationRailState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _AppNavigationRailState extends State<AppNavigationRail> {
|
|
||||||
final List<NavigationRailDestination> destinations = const [
|
|
||||||
NavigationRailDestination(icon: Icon(Icons.color_lens_outlined), label: Text("颜色板")),
|
|
||||||
NavigationRailDestination(icon: Icon(Icons.add_chart), label: Text("计数器")),
|
|
||||||
NavigationRailDestination(icon: Icon(Icons.person), label: Text("我的")),
|
|
||||||
NavigationRailDestination(icon: Icon(Icons.settings), label: Text("设置")),
|
|
||||||
];
|
|
||||||
|
|
||||||
@override
|
|
||||||
void initState() {
|
|
||||||
super.initState();
|
|
||||||
router.addListener(_onRouterChange);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
void dispose() {
|
|
||||||
router.removeListener(_onRouterChange);
|
|
||||||
super.dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return TolyNavigationRail(
|
|
||||||
leading: Padding(
|
|
||||||
padding: const EdgeInsets.symmetric(vertical: 18.0),
|
|
||||||
child: FlutterLogo(),
|
|
||||||
),
|
|
||||||
backgroundColor: const Color(0xff3975c6),
|
|
||||||
onDestinationSelected: _onDestinationSelected,
|
|
||||||
selectedIndex: router.activeIndex,
|
|
||||||
);
|
|
||||||
|
|
||||||
// return NavigationRail(
|
|
||||||
// backgroundColor: Colors.transparent,
|
|
||||||
// labelType: NavigationRailLabelType.all,
|
|
||||||
// onDestinationSelected: _onDestinationSelected,
|
|
||||||
// destinations: destinations,
|
|
||||||
// selectedIndex: router.activeIndex,
|
|
||||||
// );
|
|
||||||
}
|
|
||||||
|
|
||||||
void _onDestinationSelected(int index) {
|
|
||||||
router.path = kDestinationsPaths[index];
|
|
||||||
}
|
|
||||||
|
|
||||||
void _onRouterChange() {
|
|
||||||
setState(() {});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
import 'dart:math';
|
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
class Background extends StatelessWidget {
|
|
||||||
const Background({Key? key}) : super(key: key);
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Container(
|
|
||||||
decoration: const BoxDecoration(
|
|
||||||
gradient:
|
|
||||||
LinearGradient(transform: GradientRotation(pi / 2), colors: [
|
|
||||||
Color(0xffF1EFF1),
|
|
||||||
Color(0xffFFFFFF),
|
|
||||||
])),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,108 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import '../router/app_router_delegate.dart';
|
|
||||||
import 'package:window_manager/window_manager.dart';
|
|
||||||
|
|
||||||
import '../../../components/tolyui/navigation/toly_breadcrumb.dart';
|
|
||||||
import '../../../components/windows/window_buttons.dart';
|
|
||||||
|
|
||||||
class TopBar extends StatelessWidget {
|
|
||||||
const TopBar({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return DragToMoveAreaNoDouble(
|
|
||||||
child: Container(
|
|
||||||
alignment: Alignment.center,
|
|
||||||
height: 46,
|
|
||||||
child: Row(
|
|
||||||
children: [
|
|
||||||
const SizedBox(
|
|
||||||
width: 16,
|
|
||||||
),
|
|
||||||
RouterIndicator(),
|
|
||||||
Spacer(),
|
|
||||||
WindowButtons()
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class RouterIndicator extends StatefulWidget {
|
|
||||||
const RouterIndicator({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
State<RouterIndicator> createState() => _RouterIndicatorState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _RouterIndicatorState extends State<RouterIndicator> {
|
|
||||||
@override
|
|
||||||
void initState() {
|
|
||||||
super.initState();
|
|
||||||
router.addListener(_onRouterChange);
|
|
||||||
}
|
|
||||||
|
|
||||||
Map<String, String> routeLabelMap = {
|
|
||||||
'/color': '颜色板',
|
|
||||||
'/color/add': '添加颜色',
|
|
||||||
'/color/detail': '颜色详情',
|
|
||||||
'/counter': '计数器',
|
|
||||||
'/user': '我的',
|
|
||||||
'/settings': '系统设置',
|
|
||||||
};
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return TolyBreadcrumb(
|
|
||||||
items: pathToBreadcrumbItems(router.path),
|
|
||||||
onTapItem: (item){
|
|
||||||
if(item.to!=null){
|
|
||||||
router.path = item.to!;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void _onRouterChange() {
|
|
||||||
print('_onRouterChange');
|
|
||||||
setState(() {});
|
|
||||||
}
|
|
||||||
|
|
||||||
List<BreadcrumbItem> pathToBreadcrumbItems(String path) {
|
|
||||||
Uri uri = Uri.parse(path);
|
|
||||||
List<BreadcrumbItem> result = [];
|
|
||||||
String to = '';
|
|
||||||
|
|
||||||
String distPath = '';
|
|
||||||
for (String segment in uri.pathSegments) {
|
|
||||||
distPath += '/$segment';
|
|
||||||
}
|
|
||||||
|
|
||||||
for (String segment in uri.pathSegments) {
|
|
||||||
to += '/$segment';
|
|
||||||
result.add(BreadcrumbItem(to: to, label: routeLabelMap[to] ?? '未知路由',active: to==distPath));
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class DragToMoveAreaNoDouble extends StatelessWidget {
|
|
||||||
final Widget child;
|
|
||||||
|
|
||||||
const DragToMoveAreaNoDouble({
|
|
||||||
Key? key,
|
|
||||||
required this.child,
|
|
||||||
}) : super(key: key);
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return GestureDetector(
|
|
||||||
behavior: HitTestBehavior.translucent,
|
|
||||||
onPanStart: (details) {
|
|
||||||
windowManager.startDragging();
|
|
||||||
},
|
|
||||||
child: child,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'navigation/router/app_router_delegate.dart';
|
|
||||||
import 'navigation/views/app_navigation.dart';
|
|
||||||
import 'navigation/views/app_navigation_rail.dart';
|
|
||||||
|
|
||||||
class UnitApp extends StatelessWidget {
|
|
||||||
const UnitApp({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
|
|
||||||
return MaterialApp(
|
|
||||||
theme: ThemeData(
|
|
||||||
fontFamily: "宋体",
|
|
||||||
appBarTheme: const AppBarTheme(
|
|
||||||
elevation: 0,
|
|
||||||
iconTheme: IconThemeData(color: Colors.black),
|
|
||||||
titleTextStyle: TextStyle(
|
|
||||||
color: Colors.black,
|
|
||||||
fontSize: 18,
|
|
||||||
fontWeight: FontWeight.bold,
|
|
||||||
))),
|
|
||||||
debugShowCheckedModeBanner: false,
|
|
||||||
home: AppNavigation());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
import 'package:flutter/cupertino.dart';
|
|
||||||
|
|
||||||
class MenuMeta {
|
|
||||||
// 标签
|
|
||||||
final String label;
|
|
||||||
|
|
||||||
// 图标数据
|
|
||||||
final IconData icon;
|
|
||||||
|
|
||||||
// 图标颜色
|
|
||||||
final Color? color;
|
|
||||||
|
|
||||||
const MenuMeta({
|
|
||||||
required this.label,
|
|
||||||
required this.icon,
|
|
||||||
this.color,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
@@ -1,104 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:flutter/src/gestures/events.dart';
|
|
||||||
|
|
||||||
class TolyBreadcrumb extends StatelessWidget {
|
|
||||||
final List<BreadcrumbItem> items;
|
|
||||||
final ValueChanged<BreadcrumbItem>? onTapItem;
|
|
||||||
|
|
||||||
const TolyBreadcrumb({super.key, required this.items, this.onTapItem});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
List<Widget> children = [];
|
|
||||||
|
|
||||||
for (int i = 0; i < items.length; i++) {
|
|
||||||
children.add(TolyBreadcrumbItem(
|
|
||||||
item: items[i], onTapItem: onTapItem,
|
|
||||||
));
|
|
||||||
if (i != items.length - 1) {
|
|
||||||
children.add(Padding(
|
|
||||||
padding: const EdgeInsets.symmetric(horizontal: 4.0),
|
|
||||||
child: Text(
|
|
||||||
'/',
|
|
||||||
style: TextStyle(color: Colors.grey),
|
|
||||||
),
|
|
||||||
));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return Wrap(
|
|
||||||
children: children,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class TolyBreadcrumbItem extends StatefulWidget {
|
|
||||||
final BreadcrumbItem item;
|
|
||||||
final ValueChanged<BreadcrumbItem>? onTapItem;
|
|
||||||
const TolyBreadcrumbItem({super.key, required this.item, required this.onTapItem});
|
|
||||||
|
|
||||||
@override
|
|
||||||
State<TolyBreadcrumbItem> createState() => _TolyBreadcrumbItemState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _TolyBreadcrumbItemState extends State<TolyBreadcrumbItem> {
|
|
||||||
|
|
||||||
bool _hover = false;
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
bool hasTarget = (widget.item.to != null);
|
|
||||||
Color? color = (_hover&&hasTarget)?Colors.blue:null;
|
|
||||||
MouseCursor cursor = hasTarget?SystemMouseCursors.click:SystemMouseCursors.basic;
|
|
||||||
|
|
||||||
if(widget.item.active) {
|
|
||||||
color = null;
|
|
||||||
cursor = SystemMouseCursors.basic;
|
|
||||||
}
|
|
||||||
|
|
||||||
TextStyle style = TextStyle(
|
|
||||||
fontWeight: hasTarget ? FontWeight.bold : null,
|
|
||||||
color: color
|
|
||||||
);
|
|
||||||
|
|
||||||
return MouseRegion(
|
|
||||||
cursor: cursor,
|
|
||||||
onEnter: _onEnter,
|
|
||||||
onExit: _onExit,
|
|
||||||
child: GestureDetector(
|
|
||||||
onTap: () {
|
|
||||||
if(!widget.item.active){
|
|
||||||
widget.onTapItem?.call(widget.item);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
child: Text(widget.item.label, style: style)),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void _onEnter(PointerEnterEvent event) {
|
|
||||||
setState(() {
|
|
||||||
_hover = true;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
void _onExit(PointerExitEvent event) {
|
|
||||||
setState(() {
|
|
||||||
_hover = false;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class BreadcrumbItem {
|
|
||||||
final String? to;
|
|
||||||
final String label;
|
|
||||||
final bool active;
|
|
||||||
|
|
||||||
BreadcrumbItem( {this.to, required this.label,this.active=false,});
|
|
||||||
}
|
|
||||||
|
|
||||||
//<el-breadcrumb separator="/">
|
|
||||||
// <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
|
|
||||||
// <el-breadcrumb-item><a href="/">活动管理</a></el-breadcrumb-item>
|
|
||||||
// <el-breadcrumb-item>活动列表</el-breadcrumb-item>
|
|
||||||
// <el-breadcrumb-item>活动详情</el-breadcrumb-item>
|
|
||||||
// </el-breadcrumb>
|
|
||||||
@@ -1,163 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
import 'menu_meta.dart';
|
|
||||||
|
|
||||||
// final List<NavigationRailDestination> destinations = const [
|
|
||||||
// NavigationRailDestination(icon: Icon(Icons.color_lens_outlined), label: Text("颜色板")),
|
|
||||||
// NavigationRailDestination(icon: Icon(Icons.add_chart), label: Text("计数器")),
|
|
||||||
// NavigationRailDestination(icon: Icon(Icons.person), label: Text("我的")),
|
|
||||||
// NavigationRailDestination(icon: Icon(Icons.settings), label: Text("设置")),
|
|
||||||
// ];
|
|
||||||
|
|
||||||
const List<MenuMeta> kDeskNavBarMenus = [
|
|
||||||
MenuMeta(label: '颜色板', icon: Icons.color_lens_outlined),
|
|
||||||
MenuMeta(
|
|
||||||
label: '计数器',
|
|
||||||
icon: Icons.add_chart,
|
|
||||||
),
|
|
||||||
MenuMeta(
|
|
||||||
label: '我的',
|
|
||||||
icon: Icons.person,
|
|
||||||
),
|
|
||||||
MenuMeta(label: '设置', icon: Icons.settings),
|
|
||||||
];
|
|
||||||
|
|
||||||
class TolyNavigationRail extends StatelessWidget {
|
|
||||||
final ValueChanged<int> onDestinationSelected;
|
|
||||||
final Color backgroundColor;
|
|
||||||
final int? selectedIndex;
|
|
||||||
final Widget? leading;
|
|
||||||
|
|
||||||
const TolyNavigationRail({
|
|
||||||
Key? key,
|
|
||||||
required this.onDestinationSelected,
|
|
||||||
required this.selectedIndex,
|
|
||||||
this.leading,
|
|
||||||
required this.backgroundColor,
|
|
||||||
}) : super(key: key);
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Container(
|
|
||||||
width: 64,
|
|
||||||
color: backgroundColor,
|
|
||||||
child: Column(
|
|
||||||
children: [
|
|
||||||
if(leading!=null) leading!,
|
|
||||||
Expanded(
|
|
||||||
child: LeftNavigationMenu(
|
|
||||||
items: kDeskNavBarMenus,
|
|
||||||
selectedIndex: selectedIndex,
|
|
||||||
onTapItem: onDestinationSelected,
|
|
||||||
)),
|
|
||||||
// if (selectedIndex == 0) HelpButton()
|
|
||||||
],
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class LeftNavigationMenu extends StatelessWidget {
|
|
||||||
final List<MenuMeta> items;
|
|
||||||
final ValueChanged<int> onTapItem;
|
|
||||||
|
|
||||||
final int? selectedIndex;
|
|
||||||
|
|
||||||
const LeftNavigationMenu(
|
|
||||||
{Key? key,
|
|
||||||
required this.items,
|
|
||||||
required this.selectedIndex,
|
|
||||||
required this.onTapItem})
|
|
||||||
: super(key: key);
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Column(
|
|
||||||
children: items.asMap().keys.map((int index) {
|
|
||||||
return LeftNavigationBarItemWidget(
|
|
||||||
item: items[index],
|
|
||||||
selected: index == selectedIndex,
|
|
||||||
onTap: () {
|
|
||||||
onTapItem.call(index);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
}).toList(),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class LeftNavigationBarItemWidget extends StatefulWidget {
|
|
||||||
final MenuMeta item;
|
|
||||||
final bool selected;
|
|
||||||
final VoidCallback onTap;
|
|
||||||
|
|
||||||
const LeftNavigationBarItemWidget(
|
|
||||||
{Key? key,
|
|
||||||
required this.item,
|
|
||||||
required this.selected,
|
|
||||||
required this.onTap})
|
|
||||||
: super(key: key);
|
|
||||||
|
|
||||||
@override
|
|
||||||
State<LeftNavigationBarItemWidget> createState() =>
|
|
||||||
_LeftNavigationBarItemWidgetState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _LeftNavigationBarItemWidgetState
|
|
||||||
extends State<LeftNavigationBarItemWidget> {
|
|
||||||
bool _hover = false;
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
Color? bgColor;
|
|
||||||
Color iconColor;
|
|
||||||
if (widget.selected) {
|
|
||||||
bgColor = Colors.white.withOpacity(0.2);
|
|
||||||
iconColor = Colors.white;
|
|
||||||
} else {
|
|
||||||
bgColor = _hover ? Colors.white.withOpacity(0.1) : null;
|
|
||||||
iconColor = Colors.white.withOpacity(0.8);
|
|
||||||
}
|
|
||||||
|
|
||||||
return InkWell(
|
|
||||||
onTap: widget.selected
|
|
||||||
? null
|
|
||||||
: () {
|
|
||||||
widget.onTap();
|
|
||||||
setState(() {
|
|
||||||
_hover = false;
|
|
||||||
});
|
|
||||||
},
|
|
||||||
onHover: widget.selected
|
|
||||||
? null
|
|
||||||
: (v) {
|
|
||||||
setState(() {
|
|
||||||
_hover = v;
|
|
||||||
});
|
|
||||||
},
|
|
||||||
child: Container(
|
|
||||||
alignment: Alignment.center,
|
|
||||||
margin: EdgeInsets.only(bottom: 10),
|
|
||||||
width: 50,
|
|
||||||
height: 50,
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
color: bgColor, borderRadius: BorderRadius.circular(8)),
|
|
||||||
child: Wrap(
|
|
||||||
direction: Axis.vertical,
|
|
||||||
crossAxisAlignment: WrapCrossAlignment.center,
|
|
||||||
spacing: 2,
|
|
||||||
children: [
|
|
||||||
Icon(
|
|
||||||
widget.item.icon,
|
|
||||||
color: iconColor,
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
widget.item.label,
|
|
||||||
style: TextStyle(color: iconColor, fontSize: 12),
|
|
||||||
)
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,80 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:window_manager/window_manager.dart';
|
|
||||||
|
|
||||||
class WindowButtons extends StatefulWidget {
|
|
||||||
final List<Widget>? actions;
|
|
||||||
const WindowButtons({Key? key, this.actions}) : super(key: key);
|
|
||||||
|
|
||||||
@override
|
|
||||||
State<WindowButtons> createState() => _WindowButtonsState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _WindowButtonsState extends State<WindowButtons> {
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
Brightness brightness = Theme.of(context).brightness;
|
|
||||||
return Align(
|
|
||||||
alignment:Alignment.topRight,child: Wrap(
|
|
||||||
spacing: 5,
|
|
||||||
children: [
|
|
||||||
if(widget.actions!=null)
|
|
||||||
...widget.actions!,
|
|
||||||
SizedBox(
|
|
||||||
width: 30,
|
|
||||||
height: 30,
|
|
||||||
child: WindowCaptionButton.minimize(
|
|
||||||
brightness:brightness,
|
|
||||||
onPressed: () async {
|
|
||||||
bool isMinimized = await windowManager.isMinimized();
|
|
||||||
if (isMinimized) {
|
|
||||||
windowManager.restore();
|
|
||||||
} else {
|
|
||||||
windowManager.minimize();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
SizedBox(
|
|
||||||
width: 30,
|
|
||||||
height: 30,
|
|
||||||
child: FutureBuilder<bool>(
|
|
||||||
future: windowManager.isMaximized(),
|
|
||||||
builder: (BuildContext context, AsyncSnapshot<bool> snapshot) {
|
|
||||||
if (snapshot.data == true) {
|
|
||||||
return WindowCaptionButton.unmaximize(
|
|
||||||
brightness: brightness,
|
|
||||||
onPressed: () async{
|
|
||||||
await windowManager.unmaximize();
|
|
||||||
setState(() {
|
|
||||||
|
|
||||||
});
|
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return WindowCaptionButton.maximize(
|
|
||||||
brightness: brightness,
|
|
||||||
onPressed: () async{
|
|
||||||
await windowManager.maximize();
|
|
||||||
setState(() {
|
|
||||||
|
|
||||||
});
|
|
||||||
},
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
SizedBox(
|
|
||||||
height: 30,
|
|
||||||
width: 30,
|
|
||||||
child: WindowCaptionButton.close(
|
|
||||||
brightness: brightness,
|
|
||||||
onPressed: () {
|
|
||||||
windowManager.close();
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:window_manager/window_manager.dart';
|
|
||||||
|
|
||||||
import 'app/unit_app.dart';
|
|
||||||
import 'app/navigation/router/app_router_delegate.dart';
|
|
||||||
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
WidgetsFlutterBinding.ensureInitialized();
|
|
||||||
setSize();
|
|
||||||
runApp(const UnitApp());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void setSize() async{
|
|
||||||
await windowManager.ensureInitialized();
|
|
||||||
WindowOptions windowOptions = const WindowOptions(
|
|
||||||
size: Size(800, 540),
|
|
||||||
center: true,
|
|
||||||
backgroundColor: Colors.transparent,
|
|
||||||
skipTaskbar: false,
|
|
||||||
titleBarStyle: TitleBarStyle.hidden,
|
|
||||||
);
|
|
||||||
windowManager.waitUntilReadyToShow(windowOptions, () async {
|
|
||||||
await windowManager.show();
|
|
||||||
await windowManager.focus();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
@@ -1,102 +0,0 @@
|
|||||||
import 'dart:math';
|
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:flutter_colorpicker/flutter_colorpicker.dart';
|
|
||||||
|
|
||||||
class ColorAddPage extends StatefulWidget {
|
|
||||||
const ColorAddPage({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
State<ColorAddPage> createState() => _ColorAddPageState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _ColorAddPageState extends State<ColorAddPage> {
|
|
||||||
late Color _color;
|
|
||||||
|
|
||||||
@override
|
|
||||||
void initState() {
|
|
||||||
super.initState();
|
|
||||||
_color = randomColor;
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
String text = '# ${_color.value.toRadixString(16)}';
|
|
||||||
return Scaffold(
|
|
||||||
bottomNavigationBar: Container(
|
|
||||||
margin: EdgeInsets.only(right:20,bottom: 20),
|
|
||||||
// color: Colors.redAccent,
|
|
||||||
child: Row(
|
|
||||||
textDirection:TextDirection.rtl,
|
|
||||||
children: [
|
|
||||||
ElevatedButton(onPressed: (){
|
|
||||||
Navigator.of(context).pop(_color);
|
|
||||||
|
|
||||||
}, child: Text('添加')),
|
|
||||||
SizedBox(width: 12,),
|
|
||||||
OutlinedButton(onPressed: (){
|
|
||||||
Navigator.of(context).pop();
|
|
||||||
}, child: Text('取消')),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
body: Column(
|
|
||||||
// mainAxisAlignment: MainAxisAlignment.center,
|
|
||||||
children: [
|
|
||||||
Padding(
|
|
||||||
padding: const EdgeInsets.symmetric(horizontal: 16.0,vertical: 16),
|
|
||||||
child: Row(
|
|
||||||
children: [
|
|
||||||
Expanded(child: Text(text,style: TextStyle(color: _color,fontSize: 24,letterSpacing: 4),)),
|
|
||||||
Container(
|
|
||||||
margin: EdgeInsets.only(left: 10),
|
|
||||||
width: 40,
|
|
||||||
height: 40,
|
|
||||||
child: Icon(
|
|
||||||
Icons.sell_outlined,
|
|
||||||
color: Colors.white,
|
|
||||||
),
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
color: _color,
|
|
||||||
borderRadius: BorderRadius.circular(8),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
ColorPicker(
|
|
||||||
colorPickerWidth:200,
|
|
||||||
// enableAlpha: false,
|
|
||||||
displayThumbColor:true,
|
|
||||||
pickerColor: _color,
|
|
||||||
paletteType: PaletteType.hueWheel,
|
|
||||||
onColorChanged: changeColor,
|
|
||||||
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Random _random = Random();
|
|
||||||
|
|
||||||
Color get randomColor {
|
|
||||||
return Color.fromARGB(
|
|
||||||
255,
|
|
||||||
_random.nextInt(256),
|
|
||||||
_random.nextInt(256),
|
|
||||||
_random.nextInt(256),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void _selectColor() {
|
|
||||||
Navigator.of(context).pop(_color);
|
|
||||||
}
|
|
||||||
|
|
||||||
void changeColor(Color value) {
|
|
||||||
_color = value;
|
|
||||||
setState(() {
|
|
||||||
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:flutter/services.dart';
|
|
||||||
|
|
||||||
class ColorDetailPage extends StatelessWidget {
|
|
||||||
final Color color;
|
|
||||||
const ColorDetailPage({super.key, required this.color});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
|
|
||||||
const TextStyle style = TextStyle(
|
|
||||||
fontSize: 32,
|
|
||||||
fontWeight: FontWeight.bold,
|
|
||||||
color: Colors.white
|
|
||||||
);
|
|
||||||
String text = '# ${color.value.toRadixString(16)}';
|
|
||||||
return Scaffold(
|
|
||||||
// appBar: AppBar(
|
|
||||||
// systemOverlayStyle: SystemUiOverlayStyle(
|
|
||||||
// statusBarColor: Colors.transparent,
|
|
||||||
// statusBarIconBrightness: Brightness.light
|
|
||||||
// ),
|
|
||||||
// iconTheme: IconThemeData(color: Colors.white),
|
|
||||||
// titleTextStyle:TextStyle(color: Colors.white,fontSize: 18) ,
|
|
||||||
// backgroundColor: color,
|
|
||||||
// title: Text('颜色界面',),),
|
|
||||||
body: Container(
|
|
||||||
alignment: Alignment.center,
|
|
||||||
color: color,
|
|
||||||
child: Text(text ,style: style,),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:iroute/common/components/colors_panel.dart';
|
|
||||||
import '../../app/navigation/router/app_router_delegate.dart';
|
|
||||||
|
|
||||||
class ColorPage extends StatefulWidget {
|
|
||||||
const ColorPage({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
State<ColorPage> createState() => _ColorPageState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _ColorPageState extends State<ColorPage> {
|
|
||||||
final List<Color> _colors = [
|
|
||||||
Colors.red, Colors.black, Colors.blue, Colors.green, Colors.orange,
|
|
||||||
Colors.pink, Colors.purple, Colors.indigo, Colors.amber, Colors.cyan,
|
|
||||||
Colors.redAccent, Colors.grey, Colors.blueAccent, Colors.greenAccent, Colors.orangeAccent,
|
|
||||||
Colors.pinkAccent, Colors.purpleAccent, Colors.indigoAccent, Colors.amberAccent, Colors.cyanAccent,
|
|
||||||
];
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Scaffold(
|
|
||||||
// appBar: AppBar(title:const Text('颜色主页')),
|
|
||||||
floatingActionButton: FloatingActionButton(
|
|
||||||
onPressed: _toAddPage,
|
|
||||||
child: const Icon(Icons.add),
|
|
||||||
),
|
|
||||||
body: Align(
|
|
||||||
alignment: Alignment.topCenter,
|
|
||||||
child: ColorsPanel(
|
|
||||||
colors: _colors,
|
|
||||||
onSelect: _selectColor,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void _selectColor(Color color){
|
|
||||||
String value = color.value.toRadixString(16);
|
|
||||||
router.path = '/color/detail?color=$value';
|
|
||||||
}
|
|
||||||
|
|
||||||
void _toAddPage() async {
|
|
||||||
Color? color = await router.changePathForResult('/color/add');
|
|
||||||
if (color != null) {
|
|
||||||
setState(() {
|
|
||||||
_colors.add(color);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
class CounterPage extends StatefulWidget {
|
|
||||||
const CounterPage({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
State<CounterPage> createState() => _CounterPageState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _CounterPageState extends State<CounterPage> {
|
|
||||||
int _counter = 0;
|
|
||||||
|
|
||||||
void _incrementCounter() {
|
|
||||||
setState(() {
|
|
||||||
_counter++;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Scaffold(
|
|
||||||
body: Center(
|
|
||||||
child: Column(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
|
||||||
children: <Widget>[
|
|
||||||
const Text(
|
|
||||||
'You have pushed the button this many times:',
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
'$_counter',
|
|
||||||
style: Theme.of(context).textTheme.headlineMedium,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
floatingActionButton: FloatingActionButton(
|
|
||||||
onPressed: _incrementCounter,
|
|
||||||
tooltip: 'Increment',
|
|
||||||
child: const Icon(Icons.add),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
class EmptyPage extends StatelessWidget {
|
|
||||||
const EmptyPage({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Scaffold(
|
|
||||||
appBar: AppBar(
|
|
||||||
title: Text('界面走丢了'),
|
|
||||||
),
|
|
||||||
body: Scaffold(
|
|
||||||
body: Center(
|
|
||||||
child: Wrap(
|
|
||||||
spacing: 16,
|
|
||||||
crossAxisAlignment: WrapCrossAlignment.center,
|
|
||||||
direction: Axis.vertical,
|
|
||||||
children: [
|
|
||||||
Icon(Icons.nearby_error,size: 64, color: Colors.grey),
|
|
||||||
Text(
|
|
||||||
'404 界面丢失',
|
|
||||||
style: TextStyle(fontSize: 24, color: Colors.grey),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
class SettingPage extends StatelessWidget {
|
|
||||||
const SettingPage({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Scaffold(
|
|
||||||
body:Center(child: Text('SettingPage')));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,11 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
class UserPage extends StatelessWidget {
|
|
||||||
const UserPage({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Scaffold(
|
|
||||||
body:Center(child: Text('UserPage')));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
// Copyright 2021, the Flutter project authors. Please see the AUTHORS file
|
|
||||||
// for details. All rights reserved. Use of this source code is governed by a
|
|
||||||
// BSD-style license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
class FadeTransitionPage<T> extends Page<T> {
|
|
||||||
final Widget child;
|
|
||||||
final Duration duration;
|
|
||||||
|
|
||||||
const FadeTransitionPage({
|
|
||||||
super.key,
|
|
||||||
required this.child,
|
|
||||||
this.duration = const Duration(milliseconds: 300),
|
|
||||||
});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Route<T> createRoute(BuildContext context) =>
|
|
||||||
PageBasedFadeTransitionRoute<T>(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
class PageBasedFadeTransitionRoute<T> extends PageRoute<T> {
|
|
||||||
final FadeTransitionPage<T> _page;
|
|
||||||
|
|
||||||
PageBasedFadeTransitionRoute(this._page) : super(settings: _page);
|
|
||||||
|
|
||||||
@override
|
|
||||||
Color? get barrierColor => null;
|
|
||||||
|
|
||||||
@override
|
|
||||||
String? get barrierLabel => null;
|
|
||||||
|
|
||||||
@override
|
|
||||||
Duration get transitionDuration => _page.duration;
|
|
||||||
|
|
||||||
@override
|
|
||||||
bool get maintainState => true;
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget buildPage(BuildContext context, Animation<double> animation,
|
|
||||||
Animation<double> secondaryAnimation) {
|
|
||||||
var curveTween = CurveTween(curve: Curves.easeIn);
|
|
||||||
return FadeTransition(
|
|
||||||
opacity: animation.drive(curveTween),
|
|
||||||
child: (settings as FadeTransitionPage).child,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget buildTransitions(BuildContext context, Animation<double> animation,
|
|
||||||
Animation<double> secondaryAnimation, Widget child) =>
|
|
||||||
child;
|
|
||||||
}
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
// Copyright 2021, the Flutter project authors. Please see the AUTHORS file
|
|
||||||
// for details. All rights reserved. Use of this source code is governed by a
|
|
||||||
// BSD-style license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
class NoTransitionPage<T> extends Page<T> {
|
|
||||||
final Widget child;
|
|
||||||
|
|
||||||
const NoTransitionPage({
|
|
||||||
super.key,
|
|
||||||
required this.child,
|
|
||||||
});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Route<T> createRoute(BuildContext context) => NoTransitionRoute<T>(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
class NoTransitionRoute<T> extends PageRoute<T> {
|
|
||||||
|
|
||||||
final NoTransitionPage<T> _page;
|
|
||||||
|
|
||||||
NoTransitionRoute(this._page) : super(settings: _page);
|
|
||||||
|
|
||||||
@override
|
|
||||||
Color? get barrierColor => null;
|
|
||||||
|
|
||||||
@override
|
|
||||||
String? get barrierLabel => null;
|
|
||||||
|
|
||||||
@override
|
|
||||||
Duration get transitionDuration => const Duration(milliseconds: 0);
|
|
||||||
|
|
||||||
@override
|
|
||||||
bool get maintainState => true;
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget buildPage(BuildContext context, Animation<double> animation,
|
|
||||||
Animation<double> secondaryAnimation) {
|
|
||||||
return (settings as NoTransitionPage).child;
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget buildTransitions(BuildContext context, Animation<double> animation,
|
|
||||||
Animation<double> secondaryAnimation, Widget child) =>
|
|
||||||
child;
|
|
||||||
}
|
|
||||||
@@ -6,18 +6,10 @@
|
|||||||
|
|
||||||
#include "generated_plugin_registrant.h"
|
#include "generated_plugin_registrant.h"
|
||||||
|
|
||||||
#include <screen_retriever/screen_retriever_plugin.h>
|
|
||||||
#include <url_launcher_linux/url_launcher_plugin.h>
|
#include <url_launcher_linux/url_launcher_plugin.h>
|
||||||
#include <window_manager/window_manager_plugin.h>
|
|
||||||
|
|
||||||
void fl_register_plugins(FlPluginRegistry* registry) {
|
void fl_register_plugins(FlPluginRegistry* registry) {
|
||||||
g_autoptr(FlPluginRegistrar) screen_retriever_registrar =
|
|
||||||
fl_plugin_registry_get_registrar_for_plugin(registry, "ScreenRetrieverPlugin");
|
|
||||||
screen_retriever_plugin_register_with_registrar(screen_retriever_registrar);
|
|
||||||
g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar =
|
g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar =
|
||||||
fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin");
|
fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin");
|
||||||
url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar);
|
url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar);
|
||||||
g_autoptr(FlPluginRegistrar) window_manager_registrar =
|
|
||||||
fl_plugin_registry_get_registrar_for_plugin(registry, "WindowManagerPlugin");
|
|
||||||
window_manager_plugin_register_with_registrar(window_manager_registrar);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,9 +3,7 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
list(APPEND FLUTTER_PLUGIN_LIST
|
list(APPEND FLUTTER_PLUGIN_LIST
|
||||||
screen_retriever
|
|
||||||
url_launcher_linux
|
url_launcher_linux
|
||||||
window_manager
|
|
||||||
)
|
)
|
||||||
|
|
||||||
list(APPEND FLUTTER_FFI_PLUGIN_LIST
|
list(APPEND FLUTTER_FFI_PLUGIN_LIST
|
||||||
|
|||||||
@@ -5,12 +5,8 @@
|
|||||||
import FlutterMacOS
|
import FlutterMacOS
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
import screen_retriever
|
|
||||||
import url_launcher_macos
|
import url_launcher_macos
|
||||||
import window_manager
|
|
||||||
|
|
||||||
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
|
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
|
||||||
ScreenRetrieverPlugin.register(with: registry.registrar(forPlugin: "ScreenRetrieverPlugin"))
|
|
||||||
UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))
|
UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin"))
|
||||||
WindowManagerPlugin.register(with: registry.registrar(forPlugin: "WindowManagerPlugin"))
|
|
||||||
}
|
}
|
||||||
|
|||||||
16
pubspec.lock
16
pubspec.lock
@@ -208,14 +208,6 @@ packages:
|
|||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.flutter-io.cn"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.2.1"
|
version: "3.2.1"
|
||||||
screen_retriever:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: screen_retriever
|
|
||||||
sha256: "6ee02c8a1158e6dae7ca430da79436e3b1c9563c8cf02f524af997c201ac2b90"
|
|
||||||
url: "https://pub.flutter-io.cn"
|
|
||||||
source: hosted
|
|
||||||
version: "0.1.9"
|
|
||||||
sky_engine:
|
sky_engine:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description: flutter
|
description: flutter
|
||||||
@@ -364,14 +356,6 @@ packages:
|
|||||||
url: "https://pub.flutter-io.cn"
|
url: "https://pub.flutter-io.cn"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.1.4-beta"
|
version: "0.1.4-beta"
|
||||||
window_manager:
|
|
||||||
dependency: "direct main"
|
|
||||||
description:
|
|
||||||
name: window_manager
|
|
||||||
sha256: dcc865277f26a7dad263a47d0e405d77e21f12cb71f30333a52710a408690bd7
|
|
||||||
url: "https://pub.flutter-io.cn"
|
|
||||||
source: hosted
|
|
||||||
version: "0.3.7"
|
|
||||||
sdks:
|
sdks:
|
||||||
dart: ">=3.1.1 <4.0.0"
|
dart: ">=3.1.1 <4.0.0"
|
||||||
flutter: ">=3.13.0"
|
flutter: ">=3.13.0"
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ dependencies:
|
|||||||
flutter:
|
flutter:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
flutter_colorpicker: ^1.0.3
|
flutter_colorpicker: ^1.0.3
|
||||||
window_manager: ^0.3.7
|
# window_manager: ^0.3.7
|
||||||
adaptive_navigation: ^0.0.4
|
adaptive_navigation: ^0.0.4
|
||||||
go_router: ^10.1.0
|
go_router: ^10.1.0
|
||||||
provider: 6.0.5
|
provider: 6.0.5
|
||||||
|
|||||||
@@ -6,15 +6,9 @@
|
|||||||
|
|
||||||
#include "generated_plugin_registrant.h"
|
#include "generated_plugin_registrant.h"
|
||||||
|
|
||||||
#include <screen_retriever/screen_retriever_plugin.h>
|
|
||||||
#include <url_launcher_windows/url_launcher_windows.h>
|
#include <url_launcher_windows/url_launcher_windows.h>
|
||||||
#include <window_manager/window_manager_plugin.h>
|
|
||||||
|
|
||||||
void RegisterPlugins(flutter::PluginRegistry* registry) {
|
void RegisterPlugins(flutter::PluginRegistry* registry) {
|
||||||
ScreenRetrieverPluginRegisterWithRegistrar(
|
|
||||||
registry->GetRegistrarForPlugin("ScreenRetrieverPlugin"));
|
|
||||||
UrlLauncherWindowsRegisterWithRegistrar(
|
UrlLauncherWindowsRegisterWithRegistrar(
|
||||||
registry->GetRegistrarForPlugin("UrlLauncherWindows"));
|
registry->GetRegistrarForPlugin("UrlLauncherWindows"));
|
||||||
WindowManagerPluginRegisterWithRegistrar(
|
|
||||||
registry->GetRegistrarForPlugin("WindowManagerPlugin"));
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,9 +3,7 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
list(APPEND FLUTTER_PLUGIN_LIST
|
list(APPEND FLUTTER_PLUGIN_LIST
|
||||||
screen_retriever
|
|
||||||
url_launcher_windows
|
url_launcher_windows
|
||||||
window_manager
|
|
||||||
)
|
)
|
||||||
|
|
||||||
list(APPEND FLUTTER_FFI_PLUGIN_LIST
|
list(APPEND FLUTTER_FFI_PLUGIN_LIST
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ bool FlutterWindow::OnCreate() {
|
|||||||
SetChildContent(flutter_controller_->view()->GetNativeWindow());
|
SetChildContent(flutter_controller_->view()->GetNativeWindow());
|
||||||
|
|
||||||
flutter_controller_->engine()->SetNextFrameCallback([&]() {
|
flutter_controller_->engine()->SetNextFrameCallback([&]() {
|
||||||
// this->Show();
|
this->Show();
|
||||||
//delete this->Show()
|
//delete this->Show()
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user