This commit is contained in:
toly
2023-10-12 08:13:08 +08:00
parent e95c34018e
commit 75690361b3
52 changed files with 1739 additions and 39 deletions

13
lib/13/go_color/main.dart Normal file
View File

@@ -0,0 +1,13 @@
import 'package:flutter/material.dart';
import 'package:url_strategy/url_strategy.dart';
import 'pages/app.dart';
void main() {
setHashUrlStrategy();
runApp(const App());
}

View File

@@ -0,0 +1,50 @@
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:iroute/common/pages/stl_color_page.dart';
import '../route/parser.dart';
import 'home_page.dart';
import 'color_add_page.dart';
class App extends StatefulWidget {
const App({super.key});
@override
State<App> createState() => _AppState();
}
class _AppState extends State<App> {
GoRouter router = GoRouter(
initialLocation: '/color',
routes: <GoRoute>[
GoRoute(path: '/color',builder: (ctx,state)=>HomePage()),
GoRoute(path: '/color/detail',builder: (ctx,state) {
String selectedColor = state.uri.queryParameters['color']??'';
return StlColorPage(
color: Color(int.parse(selectedColor,radix: 16)),
);
}),
GoRoute(path: '/color/add',builder: (ctx,state)=>ColorAddPage()),
]
);
@override
Widget build(BuildContext context) {
return MaterialApp.router(
routerConfig: router,
// backButtonDispatcher: RootBackButtonDispatcher(),
theme: ThemeData(
useMaterial3: true,
appBarTheme: const AppBarTheme(
elevation: 0,
iconTheme: IconThemeData(color: Colors.black),
titleTextStyle: TextStyle(
color: Colors.black,
fontSize: 18,
fontWeight: FontWeight.bold,
))),
debugShowCheckedModeBanner: false,
);
}
}

View File

@@ -0,0 +1,67 @@
import 'dart:math';
import 'package:flutter/material.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(
appBar: AppBar(
title: Text('添加颜色'),
actions: [IconButton(onPressed: _selectColor, icon: Icon(Icons.check ))],
),
body: Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0,vertical: 20),
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),
),
),
],
),
),
);
}
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);
}
}

View File

@@ -0,0 +1,61 @@
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import '../route/route_state.dart';
import 'app.dart';
import 'color_add_page.dart';
import '../../../common/components/colors_panel.dart';
import '../../../common/pages/stl_color_page.dart';
class HomePage extends StatefulWidget {
const HomePage({super.key});
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
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
void dispose() {
print('_HomePageState#dispose');
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title:const Text('颜色主页')),
floatingActionButton: FloatingActionButton(
onPressed: _toAddPage,
child: const Icon(Icons.add),
),
body: ColorsPanel(
colors: _colors,
onSelect: _selectColor,
),
);
}
void _selectColor(Color color){
String value = color.value.toRadixString(16);
context.push('/color/detail?color=$value');
context.go('/color/detail?color=$value');
// routerDelegate.go('/color/detail?color=$value');
}
void _toAddPage() async {
Color? color = await context.push<Color?>('/color/add');
if (color != null) {
setState(() {
_colors.add(color);
});
}
}
}

View File

@@ -0,0 +1,21 @@
// // 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:collection/collection.dart';
// import 'package:equatable/equatable.dart';
// import 'package:quiver/core.dart';
//
// /// A route path that has been parsed by [TemplateRouteParser].
// class ParsedRoute extends Equatable{
// /// The current path location without query parameters. (/book/123)
// final String path;
//
// /// The query parameters ({search: abc})
// final Map<String, String> queryParameters;
//
// const ParsedRoute(this.path, this.queryParameters);
//
// @override
// List<Object?> get props => [path,queryParameters];
// }

View File

@@ -0,0 +1,112 @@
// 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/app.dart';
// import '../pages/home_page.dart';
// import '../pages/color_add_page.dart';
// import 'parsed_route.dart';
// import 'route_state.dart';
//
// class AppRouteParser extends RouteInformationParser<ParsedRoute> {
//
// @override
// Future<ParsedRoute> parseRouteInformation(
// RouteInformation routeInformation) async {
// print("=======parseRouteInformation:${routeInformation.uri.path}===================");
//
// final uri = routeInformation.uri;
// final path = uri.toString();
// final queryParams = uri.queryParameters;
//
// return ParsedRoute(path, queryParams);
// }
//
// @override
// RouteInformation? restoreRouteInformation(ParsedRoute configuration) {
// print("=======restoreRouteInformation:${configuration}===================");
//
// return RouteInformation(uri: Uri.parse(configuration.path));
// }
// }
//
// ValueNotifier<List<String>> router = ValueNotifier(['/']);
//
// class AppRouterDelegate extends RouterDelegate<ParsedRoute>
// with ChangeNotifier, PopNavigatorRouterDelegateMixin {
//
//
// AppRouterDelegate({String initial='/'}) : _route = ParsedRoute(initial,{});
//
// late ParsedRoute _route;
//
// @override
// final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
//
// @override
// ParsedRoute get currentConfiguration {
// return _route;
// }
//
// Future<void> go(String route) async {
// _route = await parser.parseRouteInformation(RouteInformation(uri: Uri.parse(route)));
// notifyListeners();
// }
//
// @override
// void dispose() {
// super.dispose();
// }
//
// final _addColorKey = const ValueKey('addColor');
//
// @override
// Widget build(BuildContext context) {
//
// List<Page> pages =[];
// final String path = _route.path;
//
// pages.add(MaterialPage(child: HomePage()));
//
// String? selectedColor;
// if (path.startsWith('/color/detail') ) {
// selectedColor = _route.queryParameters['color'];
// }
//
// if(selectedColor!=null){
// pages.add(MaterialPage(child: StlColorPage(
// color: Color(int.parse(selectedColor,radix: 16)),
// )));
// }
//
// bool isAddPage = path == '/color/add';
// if(isAddPage){
// pages.add(MaterialPage(
// key: _addColorKey,
// child: ColorAddPage()),);
// }
//
// return Navigator(
// key: navigatorKey,
// pages: pages,
// onPopPage: (route, result) {
// if (route.settings is Page && (route.settings as Page).key == _addColorKey) {
// go('/');
// }
//
// if(selectedColor!=null){
// selectedColor = null;
// go('/');
// }
// return route.didPop(result);
// },
// );
// }
//
// @override
// Future<void> setNewRoutePath(ParsedRoute configuration) async {
// print("===setNewRoutePath===${configuration}=================");
// _route = configuration;
// }
//
// }

View File

@@ -0,0 +1,48 @@
// // 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/widgets.dart';
//
// import 'parsed_route.dart';
// import 'parser.dart';
//
// /// The current route state. To change the current route, call obtain the state
// /// using `RouteStateScope.of(context)` and call `go()`:
// ///
// /// ```
// /// RouteStateScope.of(context).go('/book/2');
// /// ```
// class RouteState extends ChangeNotifier {
// final AppRouteParser _parser;
// ParsedRoute _route;
//
// RouteState(this._parser,{String initial=''}) : _route = ParsedRoute(initial,{});
//
// ParsedRoute get route => _route;
//
// set route(ParsedRoute route) {
// // Don't notify listeners if the path hasn't changed.
// if (_route == route) return;
//
// _route = route;
// notifyListeners();
// }
//
// Future<void> go(String route) async {
// this.route = await _parser
// .parseRouteInformation(RouteInformation(uri: Uri.parse(route)));
// }
// }
//
// // /// Provides the current [RouteState] to descendant widgets in the tree.
// // class RouteStateScope extends InheritedNotifier<RouteState> {
// // const RouteStateScope({
// // required super.notifier,
// // required super.child,
// // super.key,
// // });
// //
// // static RouteState of(BuildContext context) =>
// // context.dependOnInheritedWidgetOfExactType<RouteStateScope>()!.notifier!;
// // }