From 9c91d7d7f339ffc4e381a84cd4639499fda5e8eb Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Tue, 24 Oct 2023 13:53:28 +0800 Subject: [PATCH] v5-old --- .../router/app_router_delegate.dart | 2 +- .../app/navigation/views/app_navigation.dart | 2 +- .../navigation/views/app_router_editor.dart | 2 +- lib/v5/app/unit_app.dart | 32 ++++---- .../sort/{provider => bloc}/sort_config.dart | 5 +- lib/v5/pages/sort/bloc/state.dart | 77 +++++++++++++++++++ lib/v5/pages/sort/sort_setting.dart | 4 +- lib/v5/pages/sort/views/data_painter.dart | 60 +++++++++++++++ lib/v5/pages/sort/{ => views}/sort_page.dart | 28 +++---- 9 files changed, 175 insertions(+), 37 deletions(-) rename lib/v5/pages/sort/{provider => bloc}/sort_config.dart (65%) create mode 100644 lib/v5/pages/sort/bloc/state.dart create mode 100644 lib/v5/pages/sort/views/data_painter.dart rename lib/v5/pages/sort/{ => views}/sort_page.dart (91%) diff --git a/lib/v5/app/navigation/router/app_router_delegate.dart b/lib/v5/app/navigation/router/app_router_delegate.dart index a437843..10cd84c 100644 --- a/lib/v5/app/navigation/router/app_router_delegate.dart +++ b/lib/v5/app/navigation/router/app_router_delegate.dart @@ -9,7 +9,7 @@ import '../../../pages/empty/empty_page.dart'; import '../../../pages/settings/settings_page.dart'; import '../../../pages/user/user_page.dart'; import '../../../pages/counter/counter_page.dart'; -import '../../../pages/sort/sort_page.dart'; +import '../../../pages/sort/views/sort_page.dart'; import '../transition/fade_transition_page.dart'; import '../../../pages/color/color_add_page.dart'; diff --git a/lib/v5/app/navigation/views/app_navigation.dart b/lib/v5/app/navigation/views/app_navigation.dart index f03c9e8..10c84f4 100644 --- a/lib/v5/app/navigation/views/app_navigation.dart +++ b/lib/v5/app/navigation/views/app_navigation.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:iroute/v5/pages/sort/provider/sort_config.dart'; +import 'package:iroute/v5/pages/sort/bloc/sort_config.dart'; import '../../../pages/sort/sort_setting.dart'; import '../router/app_router_delegate.dart'; import 'app_navigation_rail.dart'; diff --git a/lib/v5/app/navigation/views/app_router_editor.dart b/lib/v5/app/navigation/views/app_router_editor.dart index b100a2a..ddbe2f2 100644 --- a/lib/v5/app/navigation/views/app_router_editor.dart +++ b/lib/v5/app/navigation/views/app_router_editor.dart @@ -2,7 +2,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:iroute/components/toly_ui/button/hover_icon_button.dart'; import 'package:iroute/components/toly_ui/popable/drop_selectable_widget.dart'; -import 'package:iroute/v5/pages/sort/provider/sort_config.dart'; +import 'package:iroute/v5/pages/sort/bloc/sort_config.dart'; import '../../../pages/sort/functions.dart'; import '../router/app_router_delegate.dart'; diff --git a/lib/v5/app/unit_app.dart b/lib/v5/app/unit_app.dart index 60d28f8..e8d89a7 100644 --- a/lib/v5/app/unit_app.dart +++ b/lib/v5/app/unit_app.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import '../pages/sort/bloc/state.dart'; import 'navigation/router/app_router_delegate.dart'; import 'navigation/views/app_navigation.dart'; import 'navigation/views/app_navigation_rail.dart'; @@ -8,20 +9,23 @@ class UnitApp extends StatelessWidget { @override Widget build(BuildContext context) { - return MaterialApp( - theme: ThemeData( - fontFamily: "宋体", - scaffoldBackgroundColor: Colors.white, - appBarTheme: const AppBarTheme( - elevation: 0, - iconTheme: IconThemeData(color: Colors.black), - titleTextStyle: TextStyle( - color: Colors.black, - fontSize: 18, - fontWeight: FontWeight.bold, - ))), - debugShowCheckedModeBanner: false, - home: AppNavigation() + return SortStateScope( + notifier: SortState(), + child: MaterialApp( + theme: ThemeData( + fontFamily: "宋体", + scaffoldBackgroundColor: Colors.white, + appBarTheme: const AppBarTheme( + elevation: 0, + iconTheme: IconThemeData(color: Colors.black), + titleTextStyle: TextStyle( + color: Colors.black, + fontSize: 18, + fontWeight: FontWeight.bold, + ))), + debugShowCheckedModeBanner: false, + home: AppNavigation() + ), ); } } diff --git a/lib/v5/pages/sort/provider/sort_config.dart b/lib/v5/pages/sort/bloc/sort_config.dart similarity index 65% rename from lib/v5/pages/sort/provider/sort_config.dart rename to lib/v5/pages/sort/bloc/sort_config.dart index 33b7523..2983815 100644 --- a/lib/v5/pages/sort/provider/sort_config.dart +++ b/lib/v5/pages/sort/bloc/sort_config.dart @@ -6,12 +6,13 @@ class SortConfig { final int count; final int seed; final Duration duration; + final String name; - SortConfig(this.count, this.duration,this.seed); + SortConfig(this.count, this.duration,this.seed,this.name); } final ValueNotifier sortConfig = ValueNotifier( - SortConfig(-1, const Duration(microseconds: 1500),-1), + SortConfig(-1, const Duration(microseconds: 1500),-1,'quick'), ); diff --git a/lib/v5/pages/sort/bloc/state.dart b/lib/v5/pages/sort/bloc/state.dart new file mode 100644 index 0000000..8f9664a --- /dev/null +++ b/lib/v5/pages/sort/bloc/state.dart @@ -0,0 +1,77 @@ +import 'dart:math'; + +import 'package:flutter/cupertino.dart'; + +import '../functions.dart'; +import 'sort_config.dart'; + +enum SortStatus{ + none, // 未操作 + sorting, // 排序中 + sorted, // 排序完成 +} + +class SortState with ChangeNotifier{ + + SortStatus status = SortStatus.none; + + List data = []; + + SortConfig _config = SortConfig(-1, const Duration(microseconds: 1500),-1,'quick'); + SortConfig get config => _config; + Random random = Random(); + + set config(SortConfig config){ + _config = config; + reset(_zoneSize); + notifyListeners(); + } + + Size _zoneSize = Size.zero; + + void reset(Size zoneSize){ + _zoneSize = zoneSize; + status = SortStatus.sorting; + int count = config.count; + if(count==-1){ + count = zoneSize.width~/2; + } + if(config.seed!=-1){ + random = Random(config.seed); + } + for (int i = 0; i < count; i++) { + //随机往数组中填值 + data.add(random.nextInt(zoneSize.height.toInt())); + } + } + + void sort() async{ + status = SortStatus.sorting; + notifyListeners(); + Stopwatch stopwatch = Stopwatch()..start(); + SortFunction? sortFunction = sortFunctionMap[config.name]; + if(sortFunction!=null){ + await sortFunction(data,(arr) async { + await Future.delayed(config.duration); + data = arr; + notifyListeners(); + }); + } + status = SortStatus.sorted; + notifyListeners(); + stopwatch.stop(); + print("Sorting completed in ${stopwatch.elapsed.inMilliseconds} ms."); + } +} + +/// Provides the current [SortState] to descendant widgets in the tree. +class SortStateScope extends InheritedNotifier { + const SortStateScope({ + required super.notifier, + required super.child, + super.key, + }); + + static SortState of(BuildContext context) => + context.dependOnInheritedWidgetOfExactType()!.notifier!; +} \ No newline at end of file diff --git a/lib/v5/pages/sort/sort_setting.dart b/lib/v5/pages/sort/sort_setting.dart index b6c2302..df06c1a 100644 --- a/lib/v5/pages/sort/sort_setting.dart +++ b/lib/v5/pages/sort/sort_setting.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'provider/sort_config.dart'; +import 'bloc/sort_config.dart'; class SortSettings extends StatefulWidget { @@ -79,7 +79,7 @@ class _SortSettingsState extends State { sortConfig.value = SortConfig(int.parse(_count.text), Duration( microseconds: int.parse(_duration.text), - ),int.parse(_seed.text)); + ),int.parse(_seed.text),sortConfig.value.name); Navigator.of(context).pop(); }, child: Text('确定设置')) diff --git a/lib/v5/pages/sort/views/data_painter.dart b/lib/v5/pages/sort/views/data_painter.dart new file mode 100644 index 0000000..881d967 --- /dev/null +++ b/lib/v5/pages/sort/views/data_painter.dart @@ -0,0 +1,60 @@ +import 'package:flutter/material.dart'; + + + +class DataPainter extends CustomPainter{ + + final List data; + + DataPainter({required this.data}); + + @override + void paint(Canvas canvas, Size size) { + double itemWidth = size.width/data.length; + double height = size.height; + + Paint paint = Paint(); + paint.strokeWidth = itemWidth; + paint.strokeCap = StrokeCap.round; + + for(int i=0;i { if(count==-1){ s = widget.size.width~/2; } + if(sortConfig.value.seed!=-1){ random = Random(sortConfig.value.seed); } - for (int i = 0; i < s; i++) { + for (int i = 0; i < s; i++) { //随机往数组中填值 numbers.add(random.nextInt(widget.size.height.toInt())); - - //numbers.add(Random().nextInt(); } setState(() {}); } @@ -114,6 +115,9 @@ class _SortPageState extends State { @override Widget build(BuildContext context) { + + List numbers = SortStateScope.of(context).data; + return Scaffold( floatingActionButton: FloatingActionButton( child: Icon(Icons.run_circle_outlined), @@ -126,17 +130,9 @@ class _SortPageState extends State { stream: streamController.stream, builder: (context, snapshot) { List numbers = snapshot.data as List; - return Row( - children: numbers.asMap().keys.map((int index) { - return CustomPaint( - painter: BarPainter( - height: widget.size.height, - width: widget.size.width/numbers.length, - value: numbers[index], - index: index, - ), - ); - }).toList(), + return CustomPaint( + size: widget.size, + painter: DataPainter(data: numbers), ); }, ),