Compare commits
19 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
838d6aa668 | ||
|
|
be554094cd | ||
|
|
7b16b52761 | ||
|
|
2ceed8b9b5 | ||
|
|
6e8d926693 | ||
|
|
8de38299e2 | ||
|
|
5396712cf9 | ||
|
|
8fb4bf57d6 | ||
|
|
88cd6fb3b4 | ||
|
|
8ef81ddb33 | ||
|
|
a1a70fae78 | ||
|
|
95e510d814 | ||
|
|
39c38ca975 | ||
|
|
9c91d7d7f3 | ||
|
|
9313882748 | ||
|
|
0b3126182e | ||
|
|
8a95ed4417 | ||
|
|
e26099ac18 | ||
|
|
bcba7ebae2 |
@@ -1,27 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'pages/home_page.dart';
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
runApp(const MyApp());
|
|
||||||
}
|
|
||||||
|
|
||||||
class MyApp extends StatelessWidget {
|
|
||||||
const MyApp({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return MaterialApp(
|
|
||||||
title: 'Flutter Demo',
|
|
||||||
debugShowCheckedModeBanner: false,
|
|
||||||
theme: ThemeData(
|
|
||||||
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
|
|
||||||
useMaterial3: true,
|
|
||||||
),
|
|
||||||
home: const HomePage(),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
import 'package:flutter/material.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
|
|
||||||
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){
|
|
||||||
Route route = MaterialPageRoute(builder: (ctx) => StlColorPage(color: color));
|
|
||||||
Navigator.of(context).push(route);
|
|
||||||
}
|
|
||||||
|
|
||||||
void _toAddPage() async {
|
|
||||||
Route<Color> route = MaterialPageRoute<Color>(builder: (ctx) => const ColorAddPage());
|
|
||||||
Color? color = await Navigator.of(context).push(route);
|
|
||||||
if (color != null) {
|
|
||||||
setState(() {
|
|
||||||
_colors.add(color);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'pages/color_add_page.dart';
|
|
||||||
import '../../common/pages/stl_color_page.dart';
|
|
||||||
import 'pages/empty_page.dart';
|
|
||||||
import 'pages/home_page.dart';
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
runApp(const MyApp());
|
|
||||||
}
|
|
||||||
|
|
||||||
class MyApp extends StatelessWidget {
|
|
||||||
const MyApp({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return MaterialApp(
|
|
||||||
title: 'Flutter Demo',
|
|
||||||
debugShowCheckedModeBanner: false,
|
|
||||||
theme: ThemeData(
|
|
||||||
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
|
|
||||||
useMaterial3: true,
|
|
||||||
),
|
|
||||||
routes: routeMap,
|
|
||||||
// initialRoute: '/add_color',
|
|
||||||
onUnknownRoute: _onUnknownRoute,
|
|
||||||
onGenerateRoute: _onGenerateRoute,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// 路由映射 [字符串 --> 组件构造器]
|
|
||||||
Map<String, WidgetBuilder> get routeMap => {
|
|
||||||
'/': (ctx) => const HomePage(),
|
|
||||||
'/add_color': (ctx) => const ColorAddPage(),
|
|
||||||
};
|
|
||||||
|
|
||||||
/// 根据路由配置 [settings] 创建路由
|
|
||||||
Route? _onGenerateRoute(RouteSettings settings) {
|
|
||||||
String? name = settings.name;
|
|
||||||
Widget? child;
|
|
||||||
if (name == '/color_detail') {
|
|
||||||
Color color = settings.arguments as Color;
|
|
||||||
child = StlColorPage(color: color);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (child != null) {
|
|
||||||
return MaterialPageRoute(
|
|
||||||
builder: (ctx) => child!,
|
|
||||||
settings: settings,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
Route? _onUnknownRoute(RouteSettings settings) {
|
|
||||||
return MaterialPageRoute(
|
|
||||||
builder: (ctx) => const EmptyPage(),
|
|
||||||
settings: settings,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
import 'package:flutter/material.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
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Scaffold(
|
|
||||||
appBar: AppBar(title:const Text('颜色主页 V2')),
|
|
||||||
floatingActionButton: FloatingActionButton(
|
|
||||||
onPressed: _toAddPage,
|
|
||||||
child: const Icon(Icons.add),
|
|
||||||
),
|
|
||||||
body: ColorsPanel(
|
|
||||||
colors: _colors,
|
|
||||||
onSelect: _selectColor,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void _selectColor(Color color){
|
|
||||||
Navigator.of(context).pushNamed('/color_detail1',arguments: color);
|
|
||||||
}
|
|
||||||
|
|
||||||
void _toAddPage() async {
|
|
||||||
dynamic color = await Navigator.of(context).pushNamed('/add_color');
|
|
||||||
if (color != null) {
|
|
||||||
setState(() {
|
|
||||||
_colors.add(color);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'router1/router1.dart';
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
runApp(const MyApp());
|
|
||||||
}
|
|
||||||
|
|
||||||
class MyApp extends StatelessWidget {
|
|
||||||
const MyApp({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return MaterialApp(
|
|
||||||
title: 'Flutter Demo',
|
|
||||||
debugShowCheckedModeBanner: false,
|
|
||||||
theme: ThemeData(
|
|
||||||
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
|
|
||||||
useMaterial3: true,
|
|
||||||
),
|
|
||||||
|
|
||||||
routes: Router1.routeMap,
|
|
||||||
navigatorKey: Router1.globalNavKey,
|
|
||||||
onUnknownRoute: Router1.onUnknownRoute,
|
|
||||||
initialRoute: Router1.initialRoute,
|
|
||||||
onGenerateRoute: Router1.onGenerateRoute,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import '../router1/router1.dart';
|
|
||||||
|
|
||||||
import '../../../common/components/colors_panel.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
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Scaffold(
|
|
||||||
appBar: AppBar(title:const Text('颜色主页 V3')),
|
|
||||||
floatingActionButton: FloatingActionButton(
|
|
||||||
onPressed: _toAddPage,
|
|
||||||
child: const Icon(Icons.add),
|
|
||||||
),
|
|
||||||
body: ColorsPanel(
|
|
||||||
colors: _colors,
|
|
||||||
onSelect: _selectColor,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void _selectColor(Color color){
|
|
||||||
|
|
||||||
Router1.nav.pushNamed(Router1.kColorDetail,arguments: color);
|
|
||||||
}
|
|
||||||
|
|
||||||
void _toAddPage() async {
|
|
||||||
dynamic color = await Router1.nav.pushNamed(Router1.kAddColor);
|
|
||||||
if (color != null) {
|
|
||||||
setState(() {
|
|
||||||
_colors.add(color);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
import '../../../common/pages/stl_color_page.dart';
|
|
||||||
import '../pages/color_add_page.dart';
|
|
||||||
import '../pages/empty_page.dart';
|
|
||||||
import '../pages/home_page.dart';
|
|
||||||
|
|
||||||
class Router1 {
|
|
||||||
|
|
||||||
/// 主页面 [HomePage]
|
|
||||||
static const String kHome = '/';
|
|
||||||
|
|
||||||
/// 颜色详情页 [StlColorPage]
|
|
||||||
static const String kColorDetail = '${kHome}color_detail';
|
|
||||||
|
|
||||||
/// 添加颜色页 [ColorAddPage]
|
|
||||||
static const String kAddColor = '${kHome}add_color';
|
|
||||||
|
|
||||||
|
|
||||||
static String get initialRoute => kHome;
|
|
||||||
|
|
||||||
static final GlobalKey<NavigatorState> globalNavKey = GlobalKey();
|
|
||||||
|
|
||||||
static NavigatorState get nav => globalNavKey.currentState!;
|
|
||||||
|
|
||||||
/// 路由映射 [字符串 --> 组件构造器]
|
|
||||||
static Map<String, WidgetBuilder> get routeMap => {
|
|
||||||
kHome: (ctx) => const HomePage(),
|
|
||||||
kAddColor: (ctx) => const ColorAddPage(),
|
|
||||||
};
|
|
||||||
|
|
||||||
/// 根据路由配置 [settings] 创建路由
|
|
||||||
static Route? onGenerateRoute(RouteSettings settings) {
|
|
||||||
String? name = settings.name;
|
|
||||||
Widget? child;
|
|
||||||
if (name == kColorDetail) {
|
|
||||||
Color color = settings.arguments as Color;
|
|
||||||
child = StlColorPage(color: color);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (child != null) {
|
|
||||||
return MaterialPageRoute(
|
|
||||||
builder: (ctx) => child!,
|
|
||||||
settings: settings,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
static Route? onUnknownRoute(RouteSettings settings) {
|
|
||||||
return MaterialPageRoute(
|
|
||||||
builder: (ctx) => const EmptyPage(),
|
|
||||||
settings: settings,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
runApp(const OverlayPage());
|
|
||||||
}
|
|
||||||
|
|
||||||
class OverlayPage extends StatelessWidget{
|
|
||||||
const OverlayPage({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
final OverlayEntry home = OverlayEntry(builder: (BuildContext context) => const HomePage());
|
|
||||||
|
|
||||||
return Directionality(
|
|
||||||
textDirection: TextDirection.ltr,
|
|
||||||
child: Overlay(
|
|
||||||
initialEntries: [home],
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class HomePage extends StatelessWidget {
|
|
||||||
const HomePage({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return const ColoredBox(
|
|
||||||
color: Colors.white,
|
|
||||||
child: Align(
|
|
||||||
child: FlutterLogo(size: 60,),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
runApp(const OverlayPage());
|
|
||||||
}
|
|
||||||
|
|
||||||
class OverlayPage extends StatelessWidget{
|
|
||||||
const OverlayPage({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
final OverlayEntry home = OverlayEntry(builder: (BuildContext context) => const HomePage());
|
|
||||||
final OverlayEntry circle = OverlayEntry(builder: (BuildContext context) => const Center(child: Circle()));
|
|
||||||
|
|
||||||
return Directionality(
|
|
||||||
textDirection: TextDirection.ltr,
|
|
||||||
child: Overlay(
|
|
||||||
initialEntries: [home,circle],
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class HomePage extends StatelessWidget {
|
|
||||||
const HomePage({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return const ColoredBox(
|
|
||||||
color: Colors.white,
|
|
||||||
child: Align(
|
|
||||||
child: FlutterLogo(
|
|
||||||
size: 60,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Circle extends StatelessWidget {
|
|
||||||
const Circle({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Container(
|
|
||||||
width: 20,
|
|
||||||
height: 20,
|
|
||||||
decoration: const BoxDecoration(
|
|
||||||
color: Colors.redAccent,
|
|
||||||
shape: BoxShape.circle
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
runApp(const OverlayPage());
|
|
||||||
}
|
|
||||||
|
|
||||||
class OverlayPage extends StatelessWidget{
|
|
||||||
const OverlayPage({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
final OverlayEntry home =
|
|
||||||
OverlayEntry(builder: (BuildContext context) => const HomePage());
|
|
||||||
|
|
||||||
final OverlayEntry circle = OverlayEntry(
|
|
||||||
builder: (BuildContext context) => Positioned(
|
|
||||||
top: 50,
|
|
||||||
left: 50,
|
|
||||||
child: const Circle(),
|
|
||||||
));
|
|
||||||
|
|
||||||
return Directionality(
|
|
||||||
textDirection: TextDirection.ltr,
|
|
||||||
child: Overlay(
|
|
||||||
initialEntries: [home, circle],
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class HomePage extends StatelessWidget {
|
|
||||||
const HomePage({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return const ColoredBox(
|
|
||||||
color: Colors.white,
|
|
||||||
child: Align(
|
|
||||||
child: FlutterLogo(
|
|
||||||
size: 60,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Circle extends StatelessWidget {
|
|
||||||
const Circle({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Container(
|
|
||||||
width: 20,
|
|
||||||
height: 20,
|
|
||||||
decoration:
|
|
||||||
const BoxDecoration(color: Colors.redAccent, shape: BoxShape.circle),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,77 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
runApp(const OverlayPage());
|
|
||||||
}
|
|
||||||
|
|
||||||
class OverlayPage extends StatefulWidget {
|
|
||||||
const OverlayPage({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
State<OverlayPage> createState() => _OverlayPageState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _OverlayPageState extends State<OverlayPage> {
|
|
||||||
double _left = 0;
|
|
||||||
double _top = 0;
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
final OverlayEntry home =
|
|
||||||
OverlayEntry(builder: (BuildContext context) => const HomePage());
|
|
||||||
|
|
||||||
final OverlayEntry circle = OverlayEntry(
|
|
||||||
builder: (BuildContext context) => Positioned(
|
|
||||||
top: 50,
|
|
||||||
left: 50,
|
|
||||||
child: GestureDetector(
|
|
||||||
onPanUpdate: _updatePosition,
|
|
||||||
child: const Circle(),
|
|
||||||
),
|
|
||||||
));
|
|
||||||
|
|
||||||
return Directionality(
|
|
||||||
textDirection: TextDirection.ltr,
|
|
||||||
child: Overlay(
|
|
||||||
initialEntries: [home, circle],
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void _updatePosition(DragUpdateDetails details) {
|
|
||||||
setState(() {
|
|
||||||
_top += details.delta.dy;
|
|
||||||
_left += details.delta.dx;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class HomePage extends StatelessWidget {
|
|
||||||
const HomePage({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return const ColoredBox(
|
|
||||||
color: Colors.white,
|
|
||||||
child: Align(
|
|
||||||
child: FlutterLogo(
|
|
||||||
size: 60,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Circle extends StatelessWidget {
|
|
||||||
const Circle({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Container(
|
|
||||||
width: 20,
|
|
||||||
height: 20,
|
|
||||||
decoration:
|
|
||||||
const BoxDecoration(color: Colors.redAccent, shape: BoxShape.circle),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,127 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
runApp(const OverlayPage());
|
|
||||||
}
|
|
||||||
|
|
||||||
class OverlayPage extends StatefulWidget {
|
|
||||||
const OverlayPage({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
State<OverlayPage> createState() => _OverlayPageState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _OverlayPageState extends State<OverlayPage> {
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
final OverlayEntry home = OverlayEntry(builder: (BuildContext context) => const HomePage());
|
|
||||||
return Directionality(
|
|
||||||
textDirection: TextDirection.ltr,
|
|
||||||
child: Overlay(
|
|
||||||
initialEntries: [home],
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class HomePage extends StatefulWidget {
|
|
||||||
const HomePage({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
State<HomePage> createState() => _HomePageState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _HomePageState extends State<HomePage> {
|
|
||||||
|
|
||||||
OverlayEntry? entry;
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return ColoredBox(
|
|
||||||
color: Colors.white,
|
|
||||||
child: Align(
|
|
||||||
child: GestureDetector(
|
|
||||||
onTap: _toggle,
|
|
||||||
child: const FlutterLogo(
|
|
||||||
size: 60,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void _toggle() {
|
|
||||||
if(entry==null){
|
|
||||||
entry = _createPoint();
|
|
||||||
Overlay.of(context).insert(entry!);
|
|
||||||
}else{
|
|
||||||
entry!.remove();
|
|
||||||
entry = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
OverlayEntry _createPoint() {
|
|
||||||
return OverlayEntry(
|
|
||||||
builder: (BuildContext context) => Positioned(
|
|
||||||
width: 20,
|
|
||||||
height: 20,
|
|
||||||
left: 20,
|
|
||||||
top: 20,
|
|
||||||
child: GestureDetector(child: const Circle()),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class ClickShowPage extends StatefulWidget {
|
|
||||||
const ClickShowPage({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
State<ClickShowPage> createState() => _ClickShowPageState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _ClickShowPageState extends State<ClickShowPage> {
|
|
||||||
Offset _position = Offset.zero;
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return GestureDetector(
|
|
||||||
onTap: _addPoint,
|
|
||||||
onTapDown: _onTapDown,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void _addPoint() {
|
|
||||||
OverlayEntry entry = _createPoint();
|
|
||||||
Overlay.of(context).insert(entry);
|
|
||||||
}
|
|
||||||
|
|
||||||
OverlayEntry _createPoint() {
|
|
||||||
return OverlayEntry(
|
|
||||||
builder: (BuildContext context) => Positioned(
|
|
||||||
width: 20,
|
|
||||||
height: 20,
|
|
||||||
left: _position.dx - 10,
|
|
||||||
top: _position.dy - 10,
|
|
||||||
child: Circle()),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void _onTapDown(TapDownDetails details) {
|
|
||||||
_position = details.localPosition;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Circle extends StatelessWidget {
|
|
||||||
const Circle({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Container(
|
|
||||||
width: 20,
|
|
||||||
height: 20,
|
|
||||||
decoration:
|
|
||||||
const BoxDecoration(color: Colors.redAccent, shape: BoxShape.circle),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'pages/home_page.dart';
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
runApp(const MyApp());
|
|
||||||
}
|
|
||||||
|
|
||||||
class MyApp extends StatelessWidget {
|
|
||||||
const MyApp({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return MaterialApp(
|
|
||||||
title: 'Flutter Demo',
|
|
||||||
debugShowCheckedModeBanner: false,
|
|
||||||
theme: ThemeData(
|
|
||||||
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
|
|
||||||
useMaterial3: true,
|
|
||||||
),
|
|
||||||
home: const HomePage(),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
import 'package:flutter/material.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
|
|
||||||
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){
|
|
||||||
Route route = MaterialPageRoute(builder: (ctx) => StlColorPage(color: color));
|
|
||||||
Navigator.of(context).push(route);
|
|
||||||
}
|
|
||||||
|
|
||||||
void _toAddPage() async {
|
|
||||||
Route<Color> route = MaterialPageRoute<Color>(builder: (ctx) => const ColorAddPage());
|
|
||||||
Color? color = await Navigator.of(context).push(route);
|
|
||||||
if (color != null) {
|
|
||||||
setState(() {
|
|
||||||
_colors.add(color);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'pages/home_page.dart';
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
runApp(const MyApp());
|
|
||||||
}
|
|
||||||
|
|
||||||
class MyApp extends StatelessWidget {
|
|
||||||
const MyApp({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return MaterialApp(
|
|
||||||
title: 'Flutter Demo',
|
|
||||||
debugShowCheckedModeBanner: false,
|
|
||||||
theme: ThemeData(
|
|
||||||
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
|
|
||||||
useMaterial3: true,
|
|
||||||
),
|
|
||||||
home: const HomePage(),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
import 'package:flutter/material.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
|
|
||||||
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){
|
|
||||||
Route route = MaterialPageRoute(builder: (ctx) => StlColorPage(color: color));
|
|
||||||
Navigator.of(context).push(route);
|
|
||||||
}
|
|
||||||
|
|
||||||
void _toAddPage() async {
|
|
||||||
Route<Color> route = MaterialPageRoute<Color>(builder: (ctx) => const ColorAddPage());
|
|
||||||
Color? color = await Navigator.of(context).push(route);
|
|
||||||
if (color != null) {
|
|
||||||
setState(() {
|
|
||||||
_colors.add(color);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
import 'pages/page_a.dart';
|
|
||||||
import 'pages/page_b.dart';
|
|
||||||
import 'pages/home_page.dart';
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
runApp(const MyApp());
|
|
||||||
}
|
|
||||||
|
|
||||||
class MyApp extends StatelessWidget {
|
|
||||||
const MyApp({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return MaterialApp(
|
|
||||||
title: 'Flutter Demo',
|
|
||||||
debugShowCheckedModeBanner: false,
|
|
||||||
theme: ThemeData(
|
|
||||||
appBarTheme: AppBarTheme(
|
|
||||||
elevation: 0,
|
|
||||||
iconTheme: IconThemeData(color: Colors.black),
|
|
||||||
titleTextStyle: TextStyle(color: Colors.black,fontSize: 18,fontWeight: FontWeight.bold)
|
|
||||||
)
|
|
||||||
),
|
|
||||||
initialRoute: '/a/b',
|
|
||||||
onGenerateRoute: _onGenerateRoute,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Route? _onGenerateRoute(RouteSettings settings) {
|
|
||||||
String? name = settings.name;
|
|
||||||
Widget? page ;
|
|
||||||
if(name=='/'){
|
|
||||||
page = const HomePage();
|
|
||||||
}
|
|
||||||
if(name=='/a'){
|
|
||||||
page = const PageA();
|
|
||||||
}
|
|
||||||
if(name=='/a/b'){
|
|
||||||
page = const PageB();
|
|
||||||
}
|
|
||||||
|
|
||||||
if(page!=null){
|
|
||||||
return MaterialPageRoute(builder: (_)=> page!,settings: settings);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
class HomePage extends StatelessWidget {
|
|
||||||
const HomePage({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
const Color bgColor = Color(0xffFFE6CD);
|
|
||||||
|
|
||||||
return Scaffold(
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
appBar: AppBar(
|
|
||||||
title: const Text('主页面'),
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
),
|
|
||||||
body: Center(
|
|
||||||
child: ElevatedButton(
|
|
||||||
onPressed: ()=>toPageA(context),
|
|
||||||
child: const Text('Push A'),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void toPageA(BuildContext context){
|
|
||||||
Navigator.of(context).pushNamed('/a');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'page_b.dart';
|
|
||||||
|
|
||||||
class PageA extends StatelessWidget {
|
|
||||||
const PageA({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
const Color bgColor = Color(0xffCCFFFF);
|
|
||||||
|
|
||||||
return Scaffold(
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
appBar: AppBar(title: const Text('A'),
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
),
|
|
||||||
body: Center(
|
|
||||||
child: ElevatedButton(
|
|
||||||
onPressed: ()=>toPageB(context),
|
|
||||||
child: const Text('Push B'),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void toPageB(BuildContext context){
|
|
||||||
Navigator.of(context).push(MaterialPageRoute(builder: (_)=> const PageB()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
import 'home_page.dart';
|
|
||||||
|
|
||||||
class PageB extends StatelessWidget {
|
|
||||||
const PageB({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
const Color bgColor = Color(0xffCCE5FF);
|
|
||||||
|
|
||||||
return Scaffold(
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
appBar: AppBar(title: const Text('B',),
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
),
|
|
||||||
body: Center(
|
|
||||||
child: ElevatedButton(
|
|
||||||
onPressed: ()=>toPageC(context),
|
|
||||||
child: const Text('回到主界面'),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void toPageC(BuildContext context){
|
|
||||||
Navigator.of(context).popUntil(ModalRoute.withName('/'));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
import 'pages/page_a.dart';
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
runApp(const MyApp());
|
|
||||||
}
|
|
||||||
|
|
||||||
class MyApp extends StatelessWidget {
|
|
||||||
const MyApp({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return MaterialApp(
|
|
||||||
title: 'Flutter Demo',
|
|
||||||
debugShowCheckedModeBanner: false,
|
|
||||||
theme: ThemeData(
|
|
||||||
appBarTheme: AppBarTheme(
|
|
||||||
elevation: 0,
|
|
||||||
iconTheme: IconThemeData(color: Colors.black),
|
|
||||||
titleTextStyle: TextStyle(color: Colors.black,fontSize: 18,fontWeight: FontWeight.bold)
|
|
||||||
)
|
|
||||||
),
|
|
||||||
home: const PageA(),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'page_b.dart';
|
|
||||||
|
|
||||||
class PageA extends StatelessWidget {
|
|
||||||
const PageA({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
const Color bgColor = Color(0xffCCFFFF);
|
|
||||||
|
|
||||||
return Scaffold(
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
appBar: AppBar(title: const Text('A'),
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
),
|
|
||||||
body: Center(
|
|
||||||
child: ElevatedButton(
|
|
||||||
onPressed: ()=>toPageB(context),
|
|
||||||
child: const Text('Push B'),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void toPageB(BuildContext context){
|
|
||||||
Navigator.of(context).push(MaterialPageRoute(builder: (_)=> const PageB()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
import 'page_c.dart';
|
|
||||||
|
|
||||||
class PageB extends StatelessWidget {
|
|
||||||
const PageB({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
const Color bgColor = Color(0xffCCE5FF);
|
|
||||||
|
|
||||||
return Scaffold(
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
appBar: AppBar(title: const Text('B',),
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
),
|
|
||||||
body: Center(
|
|
||||||
child: ElevatedButton(
|
|
||||||
onPressed: ()=>toPageC(context),
|
|
||||||
child: const Text('Push C'),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void toPageC(BuildContext context){
|
|
||||||
Navigator.of(context).push(MaterialPageRoute(builder: (_)=> const PageC()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
class PageC extends StatelessWidget {
|
|
||||||
const PageC({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
const Color bgColor = Color(0xffFFE6CD);
|
|
||||||
|
|
||||||
return Scaffold(
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
appBar: AppBar(
|
|
||||||
title: const Text('C'),
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
),
|
|
||||||
body: const Center(
|
|
||||||
child: Text('到达终点'),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
01: 分析 push 方法。
|
|
||||||
A、B、C 三个界面跳转。
|
|
||||||
|
|
||||||
02: replace
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
import 'pages/page_a.dart';
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
runApp(const MyApp());
|
|
||||||
}
|
|
||||||
|
|
||||||
class MyApp extends StatelessWidget {
|
|
||||||
const MyApp({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return MaterialApp(
|
|
||||||
title: 'Flutter Demo',
|
|
||||||
debugShowCheckedModeBanner: false,
|
|
||||||
theme: ThemeData(
|
|
||||||
appBarTheme: AppBarTheme(
|
|
||||||
elevation: 0,
|
|
||||||
iconTheme: IconThemeData(color: Colors.black),
|
|
||||||
titleTextStyle: TextStyle(color: Colors.black,fontSize: 18,fontWeight: FontWeight.bold)
|
|
||||||
)
|
|
||||||
),
|
|
||||||
home: const PageA(),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'page_b.dart';
|
|
||||||
|
|
||||||
class PageA extends StatelessWidget {
|
|
||||||
const PageA({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
const Color bgColor = Color(0xffCCFFFF);
|
|
||||||
|
|
||||||
return Scaffold(
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
appBar: AppBar(title: const Text('A'),
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
),
|
|
||||||
body: Center(
|
|
||||||
child: ElevatedButton(
|
|
||||||
onPressed: ()=>toPageB(context),
|
|
||||||
child: const Text('Push B'),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void toPageB(BuildContext context){
|
|
||||||
Navigator.of(context).pushReplacement(MaterialPageRoute(builder: (_)=> const PageB()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
import 'page_c.dart';
|
|
||||||
|
|
||||||
class PageB extends StatelessWidget {
|
|
||||||
const PageB({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
const Color bgColor = Color(0xffCCE5FF);
|
|
||||||
|
|
||||||
return Scaffold(
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
appBar: AppBar(title: const Text('B',),
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
),
|
|
||||||
body: Center(
|
|
||||||
child: ElevatedButton(
|
|
||||||
onPressed: ()=>toPageC(context),
|
|
||||||
child: const Text('Push C'),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void toPageC(BuildContext context){
|
|
||||||
Navigator.of(context).pushReplacement(MaterialPageRoute(builder: (_)=> const PageC()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
class PageC extends StatelessWidget {
|
|
||||||
const PageC({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
const Color bgColor = Color(0xffFFE6CD);
|
|
||||||
|
|
||||||
return Scaffold(
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
appBar: AppBar(
|
|
||||||
title: const Text('C'),
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
),
|
|
||||||
body: const Center(
|
|
||||||
child: Text('到达终点'),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
import 'pages/page_a.dart';
|
|
||||||
import 'pages/page_b.dart';
|
|
||||||
import 'pages/page_c.dart';
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
runApp(const MyApp());
|
|
||||||
}
|
|
||||||
|
|
||||||
class MyApp extends StatelessWidget {
|
|
||||||
const MyApp({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return MaterialApp(
|
|
||||||
title: 'Flutter Demo',
|
|
||||||
debugShowCheckedModeBanner: false,
|
|
||||||
theme: ThemeData(
|
|
||||||
appBarTheme: AppBarTheme(
|
|
||||||
elevation: 0,
|
|
||||||
iconTheme: IconThemeData(color: Colors.black),
|
|
||||||
titleTextStyle: TextStyle(color: Colors.black,fontSize: 18,fontWeight: FontWeight.bold)
|
|
||||||
)
|
|
||||||
),
|
|
||||||
home: const PageA(),
|
|
||||||
onUnknownRoute: _onUnknownRoute,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Route? _onUnknownRoute(RouteSettings settings) {
|
|
||||||
String? name = settings.name;
|
|
||||||
Widget? page ;
|
|
||||||
if(name=='/a'){
|
|
||||||
page = const PageA();
|
|
||||||
}
|
|
||||||
if(name=='/b'){
|
|
||||||
page = const PageB();
|
|
||||||
}
|
|
||||||
if(name=='/c'){
|
|
||||||
page = const PageC();
|
|
||||||
}
|
|
||||||
if(page!=null){
|
|
||||||
return MaterialPageRoute(builder: (_)=> page!,settings: settings);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'page_b.dart';
|
|
||||||
|
|
||||||
class PageA extends StatelessWidget {
|
|
||||||
const PageA({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
const Color bgColor = Color(0xffCCFFFF);
|
|
||||||
|
|
||||||
return Scaffold(
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
appBar: AppBar(title: const Text('A'),
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
),
|
|
||||||
body: Center(
|
|
||||||
child: ElevatedButton(
|
|
||||||
onPressed: ()=>toPageB(context),
|
|
||||||
child: const Text('Push B'),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void toPageB(BuildContext context){
|
|
||||||
Navigator.of(context).pushNamed('/b');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
import 'page_c.dart';
|
|
||||||
|
|
||||||
class PageB extends StatelessWidget {
|
|
||||||
const PageB({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
const Color bgColor = Color(0xffCCE5FF);
|
|
||||||
|
|
||||||
return Scaffold(
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
appBar: AppBar(title: const Text('B',),
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
),
|
|
||||||
body: Center(
|
|
||||||
child: ElevatedButton(
|
|
||||||
onPressed: ()=>toPageC(context),
|
|
||||||
child: const Text('Push C'),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void toPageC(BuildContext context){
|
|
||||||
Navigator.of(context).pushNamed('/c');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
import 'page_d.dart';
|
|
||||||
|
|
||||||
class PageC extends StatelessWidget {
|
|
||||||
const PageC({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
const Color bgColor = Color(0xffFFE6CD);
|
|
||||||
|
|
||||||
return Scaffold(
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
appBar: AppBar(
|
|
||||||
title: const Text('C'),
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
),
|
|
||||||
body: Center(
|
|
||||||
child: ElevatedButton(
|
|
||||||
onPressed: ()=>toPageD(context),
|
|
||||||
child: const Text('Push D Remove Until A'),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void toPageD(BuildContext context){
|
|
||||||
Navigator.of(context).pushAndRemoveUntil(
|
|
||||||
MaterialPageRoute<void>(builder: (BuildContext context) => const PageD()),
|
|
||||||
ModalRoute.withName('/a'),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:iroute/06/02/pages/page_a.dart';
|
|
||||||
|
|
||||||
class PageD extends StatelessWidget {
|
|
||||||
const PageD({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
const Color bgColor = Color(0xffFFCCFF);
|
|
||||||
|
|
||||||
return Scaffold(
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
appBar: AppBar(
|
|
||||||
title: const Text('D'),
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
),
|
|
||||||
body: Center(
|
|
||||||
child: const Text('到达终点'),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
01: 分析 pushReplacement 方法。
|
|
||||||
A、B、C 三个界面跳转。
|
|
||||||
|
|
||||||
02: 分析 pushAndRemoveUntil 方法。
|
|
||||||
A、B、C、D 四个界面跳转。
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
import 'pages/page_a.dart';
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
runApp(const MyApp());
|
|
||||||
}
|
|
||||||
|
|
||||||
class MyApp extends StatelessWidget {
|
|
||||||
const MyApp({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return MaterialApp(
|
|
||||||
title: 'Flutter Demo',
|
|
||||||
debugShowCheckedModeBanner: false,
|
|
||||||
theme: ThemeData(
|
|
||||||
appBarTheme: AppBarTheme(
|
|
||||||
elevation: 0,
|
|
||||||
iconTheme: IconThemeData(color: Colors.black),
|
|
||||||
titleTextStyle: TextStyle(color: Colors.black,fontSize: 18,fontWeight: FontWeight.bold)
|
|
||||||
)
|
|
||||||
),
|
|
||||||
home: const PageA(),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'page_b.dart';
|
|
||||||
|
|
||||||
class PageA extends StatelessWidget {
|
|
||||||
const PageA({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
const Color bgColor = Color(0xffCCFFFF);
|
|
||||||
|
|
||||||
return Scaffold(
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
appBar: AppBar(title: const Text('A'),
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
),
|
|
||||||
body: Center(
|
|
||||||
child: ElevatedButton(
|
|
||||||
onPressed: ()=>toPageB(context),
|
|
||||||
child: const Text('Push B'),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void toPageB(BuildContext context){
|
|
||||||
Navigator.of(context).push(MaterialPageRoute(builder: (_)=> const PageB()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
import 'page_c.dart';
|
|
||||||
|
|
||||||
class PageB extends StatelessWidget {
|
|
||||||
const PageB({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
const Color bgColor = Color(0xffCCE5FF);
|
|
||||||
|
|
||||||
return Scaffold(
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
appBar: AppBar(title: const Text('B',),
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
),
|
|
||||||
body: Center(
|
|
||||||
child: ElevatedButton(
|
|
||||||
onPressed: ()=>toPageC(context),
|
|
||||||
child: const Text('Push C'),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void toPageC(BuildContext context){
|
|
||||||
Navigator.of(context).push(MaterialPageRoute(builder: (_)=> const PageC()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
class PageC extends StatelessWidget {
|
|
||||||
const PageC({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
const Color bgColor = Color(0xffFFE6CD);
|
|
||||||
|
|
||||||
return Scaffold(
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
appBar: AppBar(
|
|
||||||
title: const Text('C'),
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
leading: BackButton(
|
|
||||||
onPressed: (){
|
|
||||||
Navigator.of(context).pop();
|
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
body: const Center(
|
|
||||||
child: Text('到达终点'),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
import 'pages/page_a.dart';
|
|
||||||
import 'pages/page_b.dart';
|
|
||||||
import 'pages/page_c.dart';
|
|
||||||
import 'pages/home_page.dart';
|
|
||||||
void main() {
|
|
||||||
runApp(const MyApp());
|
|
||||||
}
|
|
||||||
|
|
||||||
class MyApp extends StatelessWidget {
|
|
||||||
const MyApp({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return MaterialApp(
|
|
||||||
title: 'Flutter Demo',
|
|
||||||
debugShowCheckedModeBanner: false,
|
|
||||||
theme: ThemeData(
|
|
||||||
appBarTheme: AppBarTheme(
|
|
||||||
elevation: 0,
|
|
||||||
iconTheme: IconThemeData(color: Colors.black),
|
|
||||||
titleTextStyle: TextStyle(color: Colors.black,fontSize: 18,fontWeight: FontWeight.bold)
|
|
||||||
)
|
|
||||||
),
|
|
||||||
onUnknownRoute: _onUnknownRoute,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Route? _onUnknownRoute(RouteSettings settings) {
|
|
||||||
String? name = settings.name;
|
|
||||||
Widget? page ;
|
|
||||||
if(name=='/'){
|
|
||||||
page = const HomePage();
|
|
||||||
}
|
|
||||||
if(name=='/a'){
|
|
||||||
page = const PageA();
|
|
||||||
}
|
|
||||||
if(name=='/b'){
|
|
||||||
page = const PageB();
|
|
||||||
}
|
|
||||||
if(name=='/c'){
|
|
||||||
page = const PageC();
|
|
||||||
}
|
|
||||||
if(page!=null){
|
|
||||||
return MaterialPageRoute(builder: (_)=> page!,settings: settings);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:iroute/06/02/pages/page_a.dart';
|
|
||||||
|
|
||||||
class HomePage extends StatelessWidget {
|
|
||||||
const HomePage({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
const Color bgColor = Color(0xffFFCCFF);
|
|
||||||
|
|
||||||
return Scaffold(
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
appBar: AppBar(
|
|
||||||
title: const Text('起点'),
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
),
|
|
||||||
body: Center(
|
|
||||||
child: ElevatedButton(
|
|
||||||
onPressed: ()=>toPageA(context),
|
|
||||||
child: const Text('Push A'),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void toPageA(BuildContext context){
|
|
||||||
Navigator.of(context).pushNamed('/a');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'page_b.dart';
|
|
||||||
|
|
||||||
class PageA extends StatelessWidget {
|
|
||||||
const PageA({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
const Color bgColor = Color(0xffCCFFFF);
|
|
||||||
|
|
||||||
return Scaffold(
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
appBar: AppBar(title: const Text('A'),
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
),
|
|
||||||
body: Center(
|
|
||||||
child: ElevatedButton(
|
|
||||||
onPressed: ()=>toPageB(context),
|
|
||||||
child: const Text('Push B'),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void toPageB(BuildContext context){
|
|
||||||
Navigator.of(context).pushNamed('/b');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
import 'page_c.dart';
|
|
||||||
|
|
||||||
class PageB extends StatelessWidget {
|
|
||||||
const PageB({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
const Color bgColor = Color(0xffCCE5FF);
|
|
||||||
|
|
||||||
return Scaffold(
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
appBar: AppBar(title: const Text('B',),
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
),
|
|
||||||
body: Center(
|
|
||||||
child: ElevatedButton(
|
|
||||||
onPressed: ()=>toPageC(context),
|
|
||||||
child: const Text('Push C'),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void toPageC(BuildContext context){
|
|
||||||
Navigator.of(context).pushNamed('/c');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
|
|
||||||
class PageC extends StatelessWidget {
|
|
||||||
const PageC({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
const Color bgColor = Color(0xffFFE6CD);
|
|
||||||
|
|
||||||
return Scaffold(
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
appBar: AppBar(
|
|
||||||
title: const Text('C'),
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
),
|
|
||||||
body: Center(
|
|
||||||
child: ElevatedButton(
|
|
||||||
onPressed: ()=>toPageD(context),
|
|
||||||
child: const Text('pop Until A'),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void toPageD(BuildContext context){
|
|
||||||
Navigator.of(context).popUntil(
|
|
||||||
ModalRoute.withName('/a')
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'pages/app/app.dart';
|
|
||||||
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
runApp(const App());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
import 'app_navigation.dart';
|
|
||||||
import 'app_tool_bar.dart';
|
|
||||||
|
|
||||||
class App extends StatelessWidget {
|
|
||||||
const App({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return MaterialApp(
|
|
||||||
theme: ThemeData(
|
|
||||||
appBarTheme: const AppBarTheme(
|
|
||||||
elevation: 0,
|
|
||||||
iconTheme: IconThemeData(color: Colors.black),
|
|
||||||
titleTextStyle: TextStyle(
|
|
||||||
color: Colors.black,
|
|
||||||
fontSize: 18,
|
|
||||||
fontWeight: FontWeight.bold,
|
|
||||||
))),
|
|
||||||
debugShowCheckedModeBanner: false,
|
|
||||||
home: const Scaffold(
|
|
||||||
appBar: AppToolBar(),
|
|
||||||
body: AppNavigation(),
|
|
||||||
));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import '../page_a.dart';
|
|
||||||
import '../page_b.dart';
|
|
||||||
import '../page_c.dart';
|
|
||||||
import '../home_page.dart';
|
|
||||||
|
|
||||||
ValueNotifier<List<String>> router = ValueNotifier(['/']);
|
|
||||||
|
|
||||||
class AppNavigation extends StatefulWidget {
|
|
||||||
const AppNavigation({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
State<AppNavigation> createState() => _AppNavigationState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _AppNavigationState extends State<AppNavigation> {
|
|
||||||
|
|
||||||
|
|
||||||
@override
|
|
||||||
void dispose() {
|
|
||||||
router.dispose();
|
|
||||||
super.dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return ValueListenableBuilder(
|
|
||||||
valueListenable: router,
|
|
||||||
builder: (_, List<String> value, __) => buildNavigatorByConfig(value),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
final Map<String, Page> _pageMap = const {
|
|
||||||
'/': MaterialPage(child: HomePage()),
|
|
||||||
'a': MaterialPage(child: PageA()),
|
|
||||||
'b': MaterialPage(child: PageB()),
|
|
||||||
'c': MaterialPage(child: PageC()),
|
|
||||||
};
|
|
||||||
|
|
||||||
Widget buildNavigatorByConfig(List<String> value) {
|
|
||||||
return Navigator(
|
|
||||||
onPopPage: _onPopPage,
|
|
||||||
pages: router.value.map((e) => _pageMap[e]!).toList(),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool _onPopPage(Route route, result) {
|
|
||||||
return route.didPop(result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'app_navigation.dart';
|
|
||||||
|
|
||||||
class AppToolBar extends StatefulWidget implements PreferredSizeWidget{
|
|
||||||
const AppToolBar({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
State<AppToolBar> createState() => _AppToolBarState();
|
|
||||||
|
|
||||||
@override
|
|
||||||
Size get preferredSize => const Size.fromHeight(kToolbarHeight);
|
|
||||||
}
|
|
||||||
|
|
||||||
class _AppToolBarState extends State<AppToolBar> {
|
|
||||||
|
|
||||||
TextEditingController _ctrl = TextEditingController();
|
|
||||||
|
|
||||||
@override
|
|
||||||
void initState() {
|
|
||||||
super.initState();
|
|
||||||
_changRoute();
|
|
||||||
router.addListener(_changRoute);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
void dispose() {
|
|
||||||
router.removeListener(_changRoute);
|
|
||||||
_ctrl.dispose();
|
|
||||||
super.dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
void _changRoute() {
|
|
||||||
_ctrl.text=router.value.join(',');
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
|
|
||||||
return AppBar(
|
|
||||||
backgroundColor: Colors.white,
|
|
||||||
elevation: 0,
|
|
||||||
title : TextField(
|
|
||||||
controller: _ctrl,
|
|
||||||
onSubmitted: _onSubmitted,
|
|
||||||
decoration: InputDecoration( //装饰
|
|
||||||
filled: true, //填充
|
|
||||||
fillColor: Color(0xffF3F6F9), //填充颜色
|
|
||||||
constraints: BoxConstraints(maxHeight: 34), //约束信息
|
|
||||||
contentPadding: EdgeInsets.only(top: -14,left: 10),
|
|
||||||
border: UnderlineInputBorder( //边线信息
|
|
||||||
borderSide: BorderSide.none,
|
|
||||||
borderRadius: BorderRadius.all(Radius.circular(6)),
|
|
||||||
),
|
|
||||||
hintText: "请输入路由", //提示字
|
|
||||||
hintStyle: TextStyle(fontSize: 14) //提示字样式
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void _onSubmitted(String value) {
|
|
||||||
router.value = value.split(',');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
import 'app/app_navigation.dart';
|
|
||||||
|
|
||||||
class HomePage extends StatelessWidget {
|
|
||||||
const HomePage({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
const Color bgColor = Color(0xffCCFFCC);
|
|
||||||
|
|
||||||
return Scaffold(
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
appBar: AppBar(
|
|
||||||
title: const Text('主页起点'),
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
),
|
|
||||||
body: Center(child: ElevatedButton(
|
|
||||||
onPressed: () => toPageA(context),
|
|
||||||
child: const Text('Push A'),
|
|
||||||
),
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
void toPageA(BuildContext context) {
|
|
||||||
router.value = ['/', 'a'];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'app/app_navigation.dart';
|
|
||||||
|
|
||||||
class PageA extends StatelessWidget {
|
|
||||||
const PageA({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
const Color bgColor = Color(0xffCCFFFF);
|
|
||||||
|
|
||||||
return Scaffold(
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
appBar: AppBar(
|
|
||||||
title: const Text('A 界面'),
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
leading: BackButton(onPressed: _pop),
|
|
||||||
),
|
|
||||||
body: Center(
|
|
||||||
child: ElevatedButton(
|
|
||||||
onPressed: () => toPageB(context),
|
|
||||||
child: const Text('Push B'),
|
|
||||||
),
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
void toPageB(BuildContext context) {
|
|
||||||
router.value = ['/', 'a', 'b'];
|
|
||||||
}
|
|
||||||
|
|
||||||
void _pop() {
|
|
||||||
router.value = List.of(router.value)..removeLast();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
import 'app/app_navigation.dart';
|
|
||||||
|
|
||||||
|
|
||||||
class PageB extends StatelessWidget {
|
|
||||||
const PageB({super.key});
|
|
||||||
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
const Color bgColor = Color(0xffCCE5FF);
|
|
||||||
|
|
||||||
return Scaffold(
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
appBar: AppBar(
|
|
||||||
title: const Text('B 界面'),
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
leading: BackButton(
|
|
||||||
onPressed: _pop,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
body: Center(
|
|
||||||
child: ElevatedButton(
|
|
||||||
onPressed: () => toPageC(context),
|
|
||||||
child: const Text('Push C'),
|
|
||||||
),
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void toPageC(BuildContext context){
|
|
||||||
router.value = ['/','a','b','c'];
|
|
||||||
}
|
|
||||||
|
|
||||||
void _pop() {
|
|
||||||
router.value = List.of(router.value)..removeLast();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
import 'app/app_navigation.dart';
|
|
||||||
|
|
||||||
class PageC extends StatelessWidget {
|
|
||||||
const PageC({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
const Color bgColor = Color(0xffFFE6CC);
|
|
||||||
|
|
||||||
return Scaffold(
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
appBar: AppBar(
|
|
||||||
title: const Text('C 界面'),
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
leading: BackButton(onPressed: _pop),
|
|
||||||
),
|
|
||||||
body: Center(
|
|
||||||
child: Text('到达终点'),
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
void _pop() {
|
|
||||||
router.value = List.of(router.value)..removeLast();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'pages/app/app.dart';
|
|
||||||
import 'pages/app/app_router_delegate.dart';
|
|
||||||
|
|
||||||
|
|
||||||
AppRouterDelegate router = AppRouterDelegate();
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
runApp(const App());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,92 +0,0 @@
|
|||||||
import 'dart:ffi';
|
|
||||||
|
|
||||||
import 'package:flutter/foundation.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import '../page_a.dart';
|
|
||||||
import '../page_b.dart';
|
|
||||||
import '../page_c.dart';
|
|
||||||
import '../home_page.dart';
|
|
||||||
|
|
||||||
class AppRouterDelegate extends RouterDelegate<Object> with ChangeNotifier{
|
|
||||||
|
|
||||||
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()),
|
|
||||||
};
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<bool> popRoute() async{
|
|
||||||
print('=======popRoute=========');
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool _onPopPage(Route route, result) {
|
|
||||||
return route.didPop(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
@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,64 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import '../../main.dart';
|
|
||||||
|
|
||||||
class AppToolBar extends StatefulWidget implements PreferredSizeWidget{
|
|
||||||
const AppToolBar({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
State<AppToolBar> createState() => _AppToolBarState();
|
|
||||||
|
|
||||||
@override
|
|
||||||
Size get preferredSize => const Size.fromHeight(kToolbarHeight);
|
|
||||||
}
|
|
||||||
|
|
||||||
class _AppToolBarState extends State<AppToolBar> {
|
|
||||||
|
|
||||||
TextEditingController _ctrl = TextEditingController();
|
|
||||||
|
|
||||||
@override
|
|
||||||
void initState() {
|
|
||||||
super.initState();
|
|
||||||
_changRoute();
|
|
||||||
router.addListener(_changRoute);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
void dispose() {
|
|
||||||
router.removeListener(_changRoute);
|
|
||||||
_ctrl.dispose();
|
|
||||||
super.dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
void _changRoute() {
|
|
||||||
_ctrl.text= router.value.join(',');
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
|
|
||||||
return AppBar(
|
|
||||||
backgroundColor: Colors.white,
|
|
||||||
elevation: 0,
|
|
||||||
title : TextField(
|
|
||||||
controller: _ctrl,
|
|
||||||
onSubmitted: _onSubmitted,
|
|
||||||
decoration: InputDecoration( //装饰
|
|
||||||
filled: true, //填充
|
|
||||||
fillColor: Color(0xffF3F6F9), //填充颜色
|
|
||||||
constraints: BoxConstraints(maxHeight: 34), //约束信息
|
|
||||||
contentPadding: EdgeInsets.only(top: -14,left: 10),
|
|
||||||
border: UnderlineInputBorder( //边线信息
|
|
||||||
borderSide: BorderSide.none,
|
|
||||||
borderRadius: BorderRadius.all(Radius.circular(6)),
|
|
||||||
),
|
|
||||||
hintText: "请输入路由", //提示字
|
|
||||||
hintStyle: TextStyle(fontSize: 14) //提示字样式
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void _onSubmitted(String value) {
|
|
||||||
router.value = value.split(',');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
import '../main.dart';
|
|
||||||
|
|
||||||
|
|
||||||
class HomePage extends StatelessWidget {
|
|
||||||
const HomePage({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
const Color bgColor = Color(0xffCCFFCC);
|
|
||||||
|
|
||||||
return Scaffold(
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
appBar: AppBar(
|
|
||||||
title: const Text('主页起点'),
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
),
|
|
||||||
body: Center(child: ElevatedButton(
|
|
||||||
onPressed: () => toPageA(context),
|
|
||||||
child: const Text('Push A'),
|
|
||||||
),
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
void toPageA(BuildContext context) {
|
|
||||||
router.value = ['/', 'a'];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import '../main.dart';
|
|
||||||
|
|
||||||
class PageA extends StatelessWidget {
|
|
||||||
const PageA({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
const Color bgColor = Color(0xffCCFFFF);
|
|
||||||
|
|
||||||
return Scaffold(
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
appBar: AppBar(
|
|
||||||
title: const Text('A 界面'),
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
leading: BackButton(onPressed: _pop),
|
|
||||||
),
|
|
||||||
body: Center(
|
|
||||||
child: ElevatedButton(
|
|
||||||
onPressed: () => toPageB(context),
|
|
||||||
child: const Text('Push B'),
|
|
||||||
),
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
void toPageB(BuildContext context) {
|
|
||||||
router.value = ['/', 'a', 'b'];
|
|
||||||
}
|
|
||||||
|
|
||||||
void _pop() {
|
|
||||||
router.value = List.of(router.value)..removeLast();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
import '../main.dart';
|
|
||||||
|
|
||||||
class PageB extends StatelessWidget {
|
|
||||||
const PageB({super.key});
|
|
||||||
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
const Color bgColor = Color(0xffCCE5FF);
|
|
||||||
|
|
||||||
return Scaffold(
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
appBar: AppBar(
|
|
||||||
title: const Text('B 界面'),
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
leading: BackButton(onPressed: _pop),
|
|
||||||
),
|
|
||||||
body: Center(
|
|
||||||
child: ElevatedButton(
|
|
||||||
onPressed: () => toPageC(context),
|
|
||||||
child: const Text('Push C'),
|
|
||||||
),
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
void toPageC(BuildContext context){
|
|
||||||
router.value = ['/','a','b','c'];
|
|
||||||
}
|
|
||||||
|
|
||||||
void _pop() {
|
|
||||||
router.value = List.of(router.value)..removeLast();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
import '../main.dart';
|
|
||||||
|
|
||||||
class PageC extends StatelessWidget {
|
|
||||||
const PageC({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
const Color bgColor = Color(0xffFFE6CC);
|
|
||||||
|
|
||||||
return Scaffold(
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
appBar: AppBar(
|
|
||||||
title: const Text('C 界面'),
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
leading: BackButton(onPressed: _pop),
|
|
||||||
),
|
|
||||||
body: Center(
|
|
||||||
child: Text('到达终点'),
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
void _pop() {
|
|
||||||
router.value = List.of(router.value)..removeLast();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:url_strategy/url_strategy.dart';
|
|
||||||
|
|
||||||
import 'pages/app.dart';
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
setHashUrlStrategy();
|
|
||||||
runApp(const App());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import '../route/parser.dart';
|
|
||||||
import '../route/route_state.dart';
|
|
||||||
|
|
||||||
class App extends StatefulWidget {
|
|
||||||
const App({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
State<App> createState() => _AppState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _AppState extends State<App> {
|
|
||||||
late final RootRouterDelegate _delegate;
|
|
||||||
late final AppRouteParser _parser;
|
|
||||||
late final RouteState _routeState;
|
|
||||||
|
|
||||||
@override
|
|
||||||
void initState() {
|
|
||||||
super.initState();
|
|
||||||
_parser = AppRouteParser(initialRoute: '/color', allowPaths: [
|
|
||||||
'/color',
|
|
||||||
'/color/add',
|
|
||||||
'/color/detail/:colorHex',
|
|
||||||
]);
|
|
||||||
_routeState = RouteState(_parser);
|
|
||||||
_delegate = RootRouterDelegate(_routeState);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return RouteStateScope(
|
|
||||||
notifier: _routeState,
|
|
||||||
child: MaterialApp.router(
|
|
||||||
routerDelegate: _delegate,
|
|
||||||
routeInformationParser: _parser,
|
|
||||||
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,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import '../route/route_state.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
|
|
||||||
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)}';
|
|
||||||
RouteStateScope.of(context).go('/color/detail/$value');
|
|
||||||
}
|
|
||||||
|
|
||||||
void _toAddPage() async {
|
|
||||||
RouteStateScope.of(context).go('/color/add');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,27 +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: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 path template (/book/:id)
|
|
||||||
final String pathTemplate;
|
|
||||||
|
|
||||||
/// The path parameters ({id: 123})
|
|
||||||
final Map<String, String> parameters;
|
|
||||||
|
|
||||||
/// The query parameters ({search: abc})
|
|
||||||
final Map<String, String> queryParameters;
|
|
||||||
|
|
||||||
const ParsedRoute(this.path, this.pathTemplate, this.parameters, this.queryParameters);
|
|
||||||
|
|
||||||
@override
|
|
||||||
List<Object?> get props => [path,pathTemplate,parameters,queryParameters];
|
|
||||||
}
|
|
||||||
@@ -1,135 +0,0 @@
|
|||||||
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/home_page.dart';
|
|
||||||
import '../pages/color_add_page.dart';
|
|
||||||
import 'parsed_route.dart';
|
|
||||||
import 'route_state.dart';
|
|
||||||
|
|
||||||
class AppRouteParser extends RouteInformationParser<ParsedRoute> {
|
|
||||||
final List<String> allowPaths;
|
|
||||||
final ParsedRoute initialRoute;
|
|
||||||
|
|
||||||
AppRouteParser({
|
|
||||||
required this.allowPaths,
|
|
||||||
String initialRoute = '/',
|
|
||||||
}):initialRoute = ParsedRoute(initialRoute, initialRoute, {}, {});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<ParsedRoute> parseRouteInformation(
|
|
||||||
RouteInformation routeInformation) async {
|
|
||||||
print("=======parseRouteInformation:${routeInformation.uri.path}===================");
|
|
||||||
|
|
||||||
final uri = routeInformation.uri;
|
|
||||||
final path = uri.toString();
|
|
||||||
final queryParams = uri.queryParameters;
|
|
||||||
|
|
||||||
ParsedRoute parsedRoute = initialRoute;
|
|
||||||
|
|
||||||
for (var pathTemplate in allowPaths) {
|
|
||||||
final parameters = <String>[];
|
|
||||||
var pathRegExp = pathToRegExp(pathTemplate, parameters: parameters);
|
|
||||||
if (pathRegExp.hasMatch(path)) {
|
|
||||||
final match = pathRegExp.matchAsPrefix(path);
|
|
||||||
if (match == null) continue;
|
|
||||||
final params = extract(parameters, match);
|
|
||||||
parsedRoute = ParsedRoute(path, pathTemplate, params, queryParams);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return parsedRoute;
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
RouteInformation? restoreRouteInformation(ParsedRoute configuration) {
|
|
||||||
print("=======restoreRouteInformation:${configuration}===================");
|
|
||||||
|
|
||||||
return RouteInformation(uri: Uri.parse(configuration.path));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class RootRouterDelegate extends RouterDelegate<ParsedRoute>
|
|
||||||
with ChangeNotifier, PopNavigatorRouterDelegateMixin {
|
|
||||||
|
|
||||||
final RouteState routeState;
|
|
||||||
|
|
||||||
|
|
||||||
RootRouterDelegate(this.routeState) {
|
|
||||||
routeState.addListener(notifyListeners);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
|
|
||||||
|
|
||||||
@override
|
|
||||||
ParsedRoute get currentConfiguration {
|
|
||||||
print("=======currentConfiguration:${routeState.route.path}===================");
|
|
||||||
|
|
||||||
return routeState.route;
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
void dispose() {
|
|
||||||
routeState.removeListener(notifyListeners);
|
|
||||||
routeState.dispose();
|
|
||||||
super.dispose();
|
|
||||||
}
|
|
||||||
final _addColorKey = const ValueKey('addColor');
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
final routeState = RouteStateScope.of(context);
|
|
||||||
List<Page> pages =[];
|
|
||||||
final String pathTemplate = routeState.route.pathTemplate;
|
|
||||||
|
|
||||||
pages.add(MaterialPage(child: HomePage()));
|
|
||||||
|
|
||||||
String? selectedColor;
|
|
||||||
if (pathTemplate == '/color/detail/:colorHex') {
|
|
||||||
selectedColor = routeState.route.parameters['colorHex'];
|
|
||||||
}
|
|
||||||
|
|
||||||
if(selectedColor!=null){
|
|
||||||
pages.add(MaterialPage(child: StlColorPage(
|
|
||||||
color: Colors.redAccent,
|
|
||||||
)));
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isAddPage = pathTemplate == '/color/add';
|
|
||||||
if(isAddPage){
|
|
||||||
pages.add(MaterialPage(
|
|
||||||
key: _addColorKey,
|
|
||||||
child: ColorAddPage()));
|
|
||||||
}
|
|
||||||
print("===build====================");
|
|
||||||
return Navigator(
|
|
||||||
key: navigatorKey,
|
|
||||||
pages: pages,
|
|
||||||
onPopPage: (route, result) {
|
|
||||||
print(result);
|
|
||||||
if (route.settings is Page &&
|
|
||||||
(route.settings as Page).key == _addColorKey) {
|
|
||||||
routeState.go('/color');
|
|
||||||
}
|
|
||||||
// appState.selectedBook = null;
|
|
||||||
// notifyListeners();
|
|
||||||
return route.didPop(result);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// 格式: /a /b
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<void> setNewRoutePath(ParsedRoute configuration) async {
|
|
||||||
print("===setNewRoutePath===${configuration}=================");
|
|
||||||
routeState.route = configuration;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// @override
|
|
||||||
// Future<void> setInitialRoutePath( configuration) async{
|
|
||||||
// _pages = [_pageMap['/']!];
|
|
||||||
// notifyListeners();
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
@@ -1,48 +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/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) : _route = _parser.initialRoute;
|
|
||||||
|
|
||||||
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!;
|
|
||||||
}
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:url_strategy/url_strategy.dart';
|
|
||||||
|
|
||||||
import 'pages/app.dart';
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
setHashUrlStrategy();
|
|
||||||
runApp(const App());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import '../route/parser.dart';
|
|
||||||
import '../route/route_state.dart';
|
|
||||||
|
|
||||||
class App extends StatefulWidget {
|
|
||||||
const App({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
State<App> createState() => _AppState();
|
|
||||||
}
|
|
||||||
|
|
||||||
class _AppState extends State<App> {
|
|
||||||
late final RootRouterDelegate _delegate;
|
|
||||||
late final AppRouteParser _parser;
|
|
||||||
late final RouteState _routeState;
|
|
||||||
|
|
||||||
@override
|
|
||||||
void initState() {
|
|
||||||
super.initState();
|
|
||||||
_parser = AppRouteParser();
|
|
||||||
_routeState = RouteState(_parser,initial: '/color');
|
|
||||||
_delegate = RootRouterDelegate(_routeState);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return RouteStateScope(
|
|
||||||
notifier: _routeState,
|
|
||||||
child: MaterialApp.router(
|
|
||||||
routerDelegate: _delegate,
|
|
||||||
routeInformationParser: _parser,
|
|
||||||
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,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import '../route/route_state.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
|
|
||||||
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);
|
|
||||||
RouteStateScope.of(context).go('/color/detail?color=$value');
|
|
||||||
}
|
|
||||||
|
|
||||||
void _toAddPage() async {
|
|
||||||
RouteStateScope.of(context).go('/color/add');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,21 +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: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];
|
|
||||||
}
|
|
||||||
@@ -1,119 +0,0 @@
|
|||||||
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/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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class RootRouterDelegate extends RouterDelegate<ParsedRoute>
|
|
||||||
with ChangeNotifier, PopNavigatorRouterDelegateMixin {
|
|
||||||
|
|
||||||
final RouteState routeState;
|
|
||||||
|
|
||||||
|
|
||||||
RootRouterDelegate(this.routeState) {
|
|
||||||
routeState.addListener(notifyListeners);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
|
|
||||||
|
|
||||||
@override
|
|
||||||
ParsedRoute get currentConfiguration {
|
|
||||||
print("=======currentConfiguration:${routeState.route.path}===================");
|
|
||||||
|
|
||||||
return routeState.route;
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
void dispose() {
|
|
||||||
routeState.removeListener(notifyListeners);
|
|
||||||
routeState.dispose();
|
|
||||||
super.dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
final _addColorKey = const ValueKey('addColor');
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
final routeState = RouteStateScope.of(context);
|
|
||||||
List<Page> pages =[];
|
|
||||||
final String path = routeState.route.path;
|
|
||||||
|
|
||||||
pages.add(MaterialPage(child: HomePage()));
|
|
||||||
|
|
||||||
String? selectedColor;
|
|
||||||
if (path.startsWith('/color/detail') ) {
|
|
||||||
selectedColor = routeState.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) {
|
|
||||||
routeState.go('/color');
|
|
||||||
}
|
|
||||||
|
|
||||||
if(selectedColor!=null){
|
|
||||||
selectedColor = null;
|
|
||||||
routeState.go('/color');
|
|
||||||
}
|
|
||||||
|
|
||||||
return route.didPop(result);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// 格式: /a /b
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<void> setNewRoutePath(ParsedRoute configuration) async {
|
|
||||||
print("===setNewRoutePath===${configuration}=================");
|
|
||||||
routeState.route = configuration;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// @override
|
|
||||||
// Future<void> setInitialRoutePath( configuration) async{
|
|
||||||
// _pages = [_pageMap['/']!];
|
|
||||||
// notifyListeners();
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
@@ -1,48 +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/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!;
|
|
||||||
}
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:url_strategy/url_strategy.dart';
|
|
||||||
|
|
||||||
import 'pages/app.dart';
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
setHashUrlStrategy();
|
|
||||||
runApp(const App());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import '../route/parser.dart';
|
|
||||||
import '../route/route_state.dart';
|
|
||||||
|
|
||||||
class App extends StatefulWidget {
|
|
||||||
const App({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
State<App> createState() => _AppState();
|
|
||||||
}
|
|
||||||
|
|
||||||
AppRouteParser parser = AppRouteParser();
|
|
||||||
AppRouterDelegate routerDelegate = AppRouterDelegate();
|
|
||||||
|
|
||||||
class _AppState extends State<App> {
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return MaterialApp.router(
|
|
||||||
routerDelegate: routerDelegate,
|
|
||||||
routeInformationParser: parser,
|
|
||||||
// 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,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
import 'package:flutter/material.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
|
|
||||||
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);
|
|
||||||
routerDelegate.go('/color/detail?color=$value');
|
|
||||||
}
|
|
||||||
|
|
||||||
void _toAddPage() async {
|
|
||||||
routerDelegate.go('/color/add');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,21 +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: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];
|
|
||||||
}
|
|
||||||
@@ -1,122 +0,0 @@
|
|||||||
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class AppRouterDelegate extends RouterDelegate<ParsedRoute>
|
|
||||||
with ChangeNotifier, PopNavigatorRouterDelegateMixin {
|
|
||||||
|
|
||||||
AppRouterDelegate({String initial = '/'}) {
|
|
||||||
_routes.add(ParsedRoute(initial, {}));
|
|
||||||
}
|
|
||||||
|
|
||||||
final List<ParsedRoute> _routes = [];
|
|
||||||
|
|
||||||
@override
|
|
||||||
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
|
|
||||||
|
|
||||||
@override
|
|
||||||
ParsedRoute get currentConfiguration {
|
|
||||||
return _routes.last;
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<void> go(String route) async {
|
|
||||||
ParsedRoute _route = await parser.parseRouteInformation(RouteInformation(uri: Uri.parse(route)));
|
|
||||||
if(_route!=_routes.last){
|
|
||||||
_routes.add(_route);
|
|
||||||
}
|
|
||||||
notifyListeners();
|
|
||||||
}
|
|
||||||
|
|
||||||
final _addColorKey = const ValueKey('addColor');
|
|
||||||
final _colorDetailKey = const ValueKey('ColorDetail');
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
List<Page> pages = [];
|
|
||||||
|
|
||||||
for (ParsedRoute route in _routes) {
|
|
||||||
Page? page = _buildPageByPath(route);
|
|
||||||
if(page!=null){
|
|
||||||
pages.add(page);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return Navigator(
|
|
||||||
key: navigatorKey,
|
|
||||||
pages: pages,
|
|
||||||
onPopPage: _onPagePop,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Page? _buildPageByPath(ParsedRoute route) {
|
|
||||||
if(route.path == '/'){
|
|
||||||
return MaterialPage(child: HomePage());
|
|
||||||
}
|
|
||||||
|
|
||||||
if(route.path.startsWith('/color/detail')){
|
|
||||||
String? selectedColor = route.queryParameters['color'];
|
|
||||||
|
|
||||||
if (selectedColor != null) {
|
|
||||||
Color color = Color(int.parse(selectedColor, radix: 16));
|
|
||||||
return MaterialPage(key: _colorDetailKey, child: StlColorPage(color: color));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (route.path == '/color/add') {
|
|
||||||
return MaterialPage(key: _addColorKey, child: ColorAddPage());
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<void> setNewRoutePath(ParsedRoute configuration) async {
|
|
||||||
print("===setNewRoutePath===${configuration}=================");
|
|
||||||
if(configuration!=_routes.last){
|
|
||||||
_routes.add(configuration);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool _onPagePop(Route route, result) {
|
|
||||||
RouteSettings settings = route.settings;
|
|
||||||
if(settings is Page){
|
|
||||||
if(settings.key==_addColorKey){
|
|
||||||
_routes.removeLast();
|
|
||||||
notifyListeners();
|
|
||||||
}
|
|
||||||
if(settings.key==_colorDetailKey){
|
|
||||||
_routes.removeLast();
|
|
||||||
notifyListeners();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return route.didPop(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,48 +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/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!;
|
|
||||||
// }
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'pages/app/app.dart';
|
|
||||||
import 'pages/app/app_router_delegate.dart';
|
|
||||||
|
|
||||||
|
|
||||||
AppRouterDelegate router = AppRouterDelegate();
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
runApp(const App());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import '../page_a.dart';
|
|
||||||
import '../page_b.dart';
|
|
||||||
import '../page_c.dart';
|
|
||||||
import '../home_page.dart';
|
|
||||||
|
|
||||||
class AppRouterDelegate extends RouterDelegate<String> with ChangeNotifier, PopNavigatorRouterDelegateMixin {
|
|
||||||
|
|
||||||
AppRouterDelegate({String initial = '/'}):_path=initial;
|
|
||||||
|
|
||||||
String _path;
|
|
||||||
|
|
||||||
String get path=> _path;
|
|
||||||
|
|
||||||
void go(String path){
|
|
||||||
_path = path;
|
|
||||||
notifyListeners();
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Navigator(
|
|
||||||
onPopPage: _onPopPage,
|
|
||||||
pages: parserConfig(_path).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()),
|
|
||||||
};
|
|
||||||
|
|
||||||
Widget buildNavigatorByConfig(String path) {
|
|
||||||
return Navigator(
|
|
||||||
onPopPage: _onPopPage,
|
|
||||||
pages: parserConfig(path).map((e) => _pageMap[e]!).toList(),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool _onPopPage(Route route, result) {
|
|
||||||
if(path.length>1){
|
|
||||||
int last = path.lastIndexOf('/');
|
|
||||||
_path = path.substring(0,last);
|
|
||||||
if(_path.isEmpty) _path = '/';
|
|
||||||
notifyListeners();
|
|
||||||
}
|
|
||||||
return route.didPop(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
GlobalKey<NavigatorState>? navigatorKey = GlobalKey<NavigatorState>();
|
|
||||||
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<void> setNewRoutePath(String configuration) async{
|
|
||||||
_path = configuration;
|
|
||||||
}
|
|
||||||
|
|
||||||
List<String> parserConfig(String path){
|
|
||||||
/// 例: /a/b/c 进栈 /,a,b,c 界面
|
|
||||||
List<String> result = ['/'];
|
|
||||||
if(path.startsWith('/')){
|
|
||||||
path = path.substring(1);
|
|
||||||
if(path.isNotEmpty){
|
|
||||||
List<String> parts = path.split('/');
|
|
||||||
result.addAll(parts);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import '../../main.dart';
|
|
||||||
|
|
||||||
class AppToolBar extends StatefulWidget implements PreferredSizeWidget{
|
|
||||||
const AppToolBar({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
State<AppToolBar> createState() => _AppToolBarState();
|
|
||||||
|
|
||||||
@override
|
|
||||||
Size get preferredSize => const Size.fromHeight(kToolbarHeight);
|
|
||||||
}
|
|
||||||
|
|
||||||
class _AppToolBarState extends State<AppToolBar> {
|
|
||||||
|
|
||||||
TextEditingController _ctrl = TextEditingController();
|
|
||||||
|
|
||||||
@override
|
|
||||||
void initState() {
|
|
||||||
super.initState();
|
|
||||||
_changRoute();
|
|
||||||
router.addListener(_changRoute);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
void dispose() {
|
|
||||||
router.removeListener(_changRoute);
|
|
||||||
_ctrl.dispose();
|
|
||||||
super.dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
void _changRoute() {
|
|
||||||
_ctrl.text=router.path;
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
|
|
||||||
return AppBar(
|
|
||||||
backgroundColor: Colors.white,
|
|
||||||
elevation: 0,
|
|
||||||
title : TextField(
|
|
||||||
controller: _ctrl,
|
|
||||||
onSubmitted: _onSubmitted,
|
|
||||||
decoration: InputDecoration( //装饰
|
|
||||||
filled: true, //填充
|
|
||||||
fillColor: Color(0xffF3F6F9), //填充颜色
|
|
||||||
constraints: BoxConstraints(maxHeight: 34), //约束信息
|
|
||||||
contentPadding: EdgeInsets.only(top: -14,left: 10),
|
|
||||||
border: UnderlineInputBorder( //边线信息
|
|
||||||
borderSide: BorderSide.none,
|
|
||||||
borderRadius: BorderRadius.all(Radius.circular(6)),
|
|
||||||
),
|
|
||||||
hintText: "请输入路由", //提示字
|
|
||||||
hintStyle: TextStyle(fontSize: 14) //提示字样式
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void _onSubmitted(String value) {
|
|
||||||
router.go(value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
import '../main.dart';
|
|
||||||
|
|
||||||
|
|
||||||
class HomePage extends StatelessWidget {
|
|
||||||
const HomePage({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
const Color bgColor = Color(0xffCCFFCC);
|
|
||||||
|
|
||||||
return Scaffold(
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
appBar: AppBar(
|
|
||||||
title: const Text('主页起点'),
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
),
|
|
||||||
body: Center(child: ElevatedButton(
|
|
||||||
onPressed: () => toPageA(context),
|
|
||||||
child: const Text('Push A'),
|
|
||||||
),
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
void toPageA(BuildContext context) {
|
|
||||||
router.go('/a');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import '../main.dart';
|
|
||||||
|
|
||||||
class PageA extends StatelessWidget {
|
|
||||||
const PageA({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
const Color bgColor = Color(0xffCCFFFF);
|
|
||||||
|
|
||||||
return Scaffold(
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
appBar: AppBar(
|
|
||||||
title: const Text('A 界面'),
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
),
|
|
||||||
body: Center(
|
|
||||||
child: ElevatedButton(
|
|
||||||
onPressed: () => toPageB(context),
|
|
||||||
child: const Text('Push B'),
|
|
||||||
),
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
void toPageB(BuildContext context) {
|
|
||||||
// router.value = ['/', 'a', 'b'];
|
|
||||||
router.go('/a/b');
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
import '../main.dart';
|
|
||||||
|
|
||||||
class PageB extends StatelessWidget {
|
|
||||||
const PageB({super.key});
|
|
||||||
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
const Color bgColor = Color(0xffCCE5FF);
|
|
||||||
|
|
||||||
return Scaffold(
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
appBar: AppBar(
|
|
||||||
title: const Text('B 界面'),
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
|
|
||||||
),
|
|
||||||
body: Center(
|
|
||||||
child: ElevatedButton(
|
|
||||||
onPressed: () => toPageC(context),
|
|
||||||
child: const Text('Push C'),
|
|
||||||
),
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
void toPageC(BuildContext context){
|
|
||||||
router.go('/a/b/c');
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
import '../main.dart';
|
|
||||||
|
|
||||||
class PageC extends StatelessWidget {
|
|
||||||
const PageC({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
const Color bgColor = Color(0xffFFE6CC);
|
|
||||||
|
|
||||||
return Scaffold(
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
appBar: AppBar(
|
|
||||||
title: const Text('C 界面'),
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
),
|
|
||||||
body: Center(
|
|
||||||
child: Text('到达终点'),
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:window_manager/window_manager.dart';
|
|
||||||
import 'pages/app/app.dart';
|
|
||||||
import 'pages/app/app_router_delegate.dart';
|
|
||||||
|
|
||||||
|
|
||||||
AppRouterDelegate router = AppRouterDelegate();
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
runApp(const App());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
import '../../main.dart';
|
|
||||||
import 'app_tool_bar.dart';
|
|
||||||
|
|
||||||
class App extends StatelessWidget {
|
|
||||||
const App({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return MaterialApp(
|
|
||||||
theme: ThemeData(
|
|
||||||
appBarTheme: const AppBarTheme(
|
|
||||||
elevation: 0,
|
|
||||||
iconTheme: IconThemeData(color: Colors.black),
|
|
||||||
titleTextStyle: TextStyle(
|
|
||||||
color: Colors.black,
|
|
||||||
fontSize: 18,
|
|
||||||
fontWeight: FontWeight.bold,
|
|
||||||
))),
|
|
||||||
debugShowCheckedModeBanner: false,
|
|
||||||
home: Scaffold(
|
|
||||||
appBar: const AppToolBar(),
|
|
||||||
body: Router(
|
|
||||||
routerDelegate: router,
|
|
||||||
backButtonDispatcher: RootBackButtonDispatcher(),
|
|
||||||
),
|
|
||||||
));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,93 +0,0 @@
|
|||||||
import 'dart:ffi';
|
|
||||||
|
|
||||||
import 'package:flutter/foundation.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import '../page_a.dart';
|
|
||||||
import '../page_b.dart';
|
|
||||||
import '../page_c.dart';
|
|
||||||
import '../home_page.dart';
|
|
||||||
|
|
||||||
class AppRouterDelegate extends RouterDelegate<Object> with ChangeNotifier{
|
|
||||||
|
|
||||||
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()),
|
|
||||||
};
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<bool> popRoute() async{
|
|
||||||
print('=======popRoute=========');
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool _onPopPage(Route route, result) {
|
|
||||||
value = List.of(_value)..removeLast();
|
|
||||||
return route.didPop(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
@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,64 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import '../../main.dart';
|
|
||||||
|
|
||||||
class AppToolBar extends StatefulWidget implements PreferredSizeWidget{
|
|
||||||
const AppToolBar({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
State<AppToolBar> createState() => _AppToolBarState();
|
|
||||||
|
|
||||||
@override
|
|
||||||
Size get preferredSize => const Size.fromHeight(kToolbarHeight);
|
|
||||||
}
|
|
||||||
|
|
||||||
class _AppToolBarState extends State<AppToolBar> {
|
|
||||||
|
|
||||||
TextEditingController _ctrl = TextEditingController();
|
|
||||||
|
|
||||||
@override
|
|
||||||
void initState() {
|
|
||||||
super.initState();
|
|
||||||
_changRoute();
|
|
||||||
router.addListener(_changRoute);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
void dispose() {
|
|
||||||
router.removeListener(_changRoute);
|
|
||||||
_ctrl.dispose();
|
|
||||||
super.dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
void _changRoute() {
|
|
||||||
_ctrl.text= router.value.join(',');
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
|
|
||||||
return AppBar(
|
|
||||||
backgroundColor: Colors.white,
|
|
||||||
elevation: 0,
|
|
||||||
title : TextField(
|
|
||||||
controller: _ctrl,
|
|
||||||
onSubmitted: _onSubmitted,
|
|
||||||
decoration: InputDecoration( //装饰
|
|
||||||
filled: true, //填充
|
|
||||||
fillColor: Color(0xffF3F6F9), //填充颜色
|
|
||||||
constraints: BoxConstraints(maxHeight: 34), //约束信息
|
|
||||||
contentPadding: EdgeInsets.only(top: -14,left: 10),
|
|
||||||
border: UnderlineInputBorder( //边线信息
|
|
||||||
borderSide: BorderSide.none,
|
|
||||||
borderRadius: BorderRadius.all(Radius.circular(6)),
|
|
||||||
),
|
|
||||||
hintText: "请输入路由", //提示字
|
|
||||||
hintStyle: TextStyle(fontSize: 14) //提示字样式
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void _onSubmitted(String value) {
|
|
||||||
router.value = value.split(',');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
|
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
import '../main.dart';
|
|
||||||
|
|
||||||
|
|
||||||
class HomePage extends StatelessWidget {
|
|
||||||
const HomePage({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
const Color bgColor = Color(0xffCCFFCC);
|
|
||||||
|
|
||||||
return Scaffold(
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
appBar: AppBar(
|
|
||||||
title: const Text('主页起点'),
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
),
|
|
||||||
body: Center(child: ElevatedButton(
|
|
||||||
onPressed: () => toPageA(context),
|
|
||||||
child: const Text('Push A'),
|
|
||||||
),
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
void toPageA(BuildContext context) {
|
|
||||||
router.value = ['/', 'a'];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
import '../main.dart';
|
|
||||||
|
|
||||||
class PageA extends StatelessWidget {
|
|
||||||
const PageA({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
const Color bgColor = Color(0xffCCFFFF);
|
|
||||||
|
|
||||||
return Scaffold(
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
appBar: AppBar(
|
|
||||||
title: const Text('A 界面'),
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
),
|
|
||||||
body: Center(
|
|
||||||
child: ElevatedButton(
|
|
||||||
onPressed: () => toPageB(context),
|
|
||||||
child: const Text('Push B'),
|
|
||||||
),
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
void toPageB(BuildContext context) {
|
|
||||||
router.value = ['/', 'a', 'b'];
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
import '../main.dart';
|
|
||||||
|
|
||||||
class PageB extends StatelessWidget {
|
|
||||||
const PageB({super.key});
|
|
||||||
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
const Color bgColor = Color(0xffCCE5FF);
|
|
||||||
|
|
||||||
return Scaffold(
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
appBar: AppBar(
|
|
||||||
title: const Text('B 界面'),
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
),
|
|
||||||
body: Center(
|
|
||||||
child: ElevatedButton(
|
|
||||||
onPressed: () => toPageC(context),
|
|
||||||
child: const Text('Push C'),
|
|
||||||
),
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
void toPageC(BuildContext context){
|
|
||||||
router.value = ['/','a','b','c'];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
import '../main.dart';
|
|
||||||
|
|
||||||
class PageC extends StatelessWidget {
|
|
||||||
const PageC({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
const Color bgColor = Color(0xffFFE6CC);
|
|
||||||
|
|
||||||
return Scaffold(
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
appBar: AppBar(
|
|
||||||
title: const Text('C 界面'),
|
|
||||||
backgroundColor: bgColor,
|
|
||||||
),
|
|
||||||
body: Center(
|
|
||||||
child: Text('到达终点'),
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user