diff --git a/notes/flutter_web/lib/app.dart b/notes/flutter_web/lib/app.dart index d80ea554..b01186fc 100644 --- a/notes/flutter_web/lib/app.dart +++ b/notes/flutter_web/lib/app.dart @@ -25,7 +25,7 @@ class App extends StatelessWidget { title: "flutter note", theme: ThemeData(colorScheme: ColorScheme.fromSeed(seedColor: Colors.tealAccent.shade700, brightness: Brightness.light), useMaterial3: true), darkTheme: ThemeData(colorScheme: ColorScheme.fromSeed(seedColor: ColorSeed.m3baseline.color, brightness: Brightness.dark), useMaterial3: true), - routerConfig: router.toRouterConfig(), + routerConfig: router.config(), ); } } diff --git a/notes/flutter_web/lib/routes/notes/layout.dart b/notes/flutter_web/lib/routes/notes/layout.dart index 596762fd..22ae9010 100644 --- a/notes/flutter_web/lib/routes/notes/layout.dart +++ b/notes/flutter_web/lib/routes/notes/layout.dart @@ -2,8 +2,10 @@ import 'package:flutter/widgets.dart'; import 'package:you_flutter/router.dart'; import 'package:you_note_dart/note.dart'; import 'package:you_note_dart/note_layouts.dart'; -/// [PageLayoutBuilder] +/// [NoteLayoutBuilder] @ToType(type: ToNote) -Widget layout(BuildContext context, ToUri uri, Cell cell) { - return NoteLayoutStyle1(uri: uri, cell: cell); +Widget layout(BuildContext context, ToUri uri, NoteBuilder builder) { + // ignore: unnecessary_type_check + assert(layout is NoteLayoutBuilder); + return NoteLayoutStyle1(uri: uri, builder: builder); } diff --git a/packages/you_cli/lib/src/cli_core.dart b/packages/you_cli/lib/src/cli_core.dart index 761eb4c5..ce65e124 100644 --- a/packages/you_cli/lib/src/cli_core.dart +++ b/packages/you_cli/lib/src/cli_core.dart @@ -60,7 +60,6 @@ class YouCli { return _rootRoute ??= await from(dir_routes); } - AnalysisSession get analysisSession { return _session ??= AnalysisContextCollection( includedPaths: [dir_lib.path], diff --git a/packages/you_cli/test/bin/cli_core_test.dart b/packages/you_cli/test/bin/cli_core_test.dart index 7ee751dd..6c071729 100644 --- a/packages/you_cli/test/bin/cli_core_test.dart +++ b/packages/you_cli/test/bin/cli_core_test.dart @@ -51,7 +51,7 @@ void main() { FileSystem fs=LocalFileSystem(); YouCli cli = YouCli(projectDir: fs.directory("../../notes/flutter_web/lib")); var result =await cli.analysisLayout(fs.file("../../notes/flutter_web/lib/routes/notes/layout.dart")); - check(result.toType!.type).equals(refer("ToNote","package:you_note_dart/note.dart")); + check(result.toType).equals(refer("ToNote","package:you_note_dart/note.dart")); }); }); diff --git a/packages/you_flutter/lib/src/router.dart b/packages/you_flutter/lib/src/router.dart index 33502249..710786a5 100644 --- a/packages/you_flutter/lib/src/router.dart +++ b/packages/you_flutter/lib/src/router.dart @@ -59,25 +59,25 @@ class YouRouter { /// [PlatformRouteInformationProvider.initialRouteInformation] required this.initial, - required this.navigatorKey, - }) : assert(root.templatePath == "/") { - routerDelegate = LoggableRouterDelegate(logger: logger, delegate: _RouterDelegate(navigatorKey: navigatorKey, router: this)); - config = RouterConfig( + required GlobalKey navigatorKey, + }) : _navigatorKey = navigatorKey, assert(root.templatePath == "/") { + _routerDelegate = LoggableRouterDelegate(logger: logger, delegate: _RouterDelegate(navigatorKey: _navigatorKey, router: this)); + _config = RouterConfig( routeInformationProvider: PlatformRouteInformationProvider(initialRouteInformation: RouteInformation(uri: initial)), - routerDelegate: routerDelegate, + routerDelegate: _routerDelegate, routeInformationParser: _RouteInformationParser(router: this), ); } final To root; final Uri initial; - final GlobalKey navigatorKey; - late final RouterConfig config; - late final RouterDelegate routerDelegate; + final GlobalKey _navigatorKey; + late final RouterConfig _config; + late final RouterDelegate _routerDelegate; static YouRouter of(BuildContext context) { var result = context.findAncestorWidgetOfExactType<_RouterScope>(); - assert(result != null, "应把ToRouter配置到您的App中: MaterialApp.router(routerConfig:ToRouter(...))"); + assert(result != null, "YouRouter not found, please: MaterialApp.router(routerConfig:YouRouter(...).config())"); return result!.router; } @@ -91,14 +91,14 @@ class YouRouter { ToUri match(String uri) => matchUri(Uri.parse(uri)); - RouterConfig toRouterConfig() => config; + RouterConfig config() => _config; void to(Uri uri) { ToUri to = matchUri(uri); - var result = routerDelegate.setNewRoutePath(to); + var result = _routerDelegate.setNewRoutePath(to); bool completed = false; result.whenComplete(() => completed = true); - assert(completed, "确保routerDelegate.setNewRoutePath内部实现是同步的,我们应该用其他方案来做Route结果,异步不好操纵"); + assert(completed, "bug: internal ensure routerDelegate.setNewRoutePath is sync implement"); } } @@ -606,7 +606,6 @@ class _RouterDelegate extends RouterDelegate with ChangeNotifier, PopNavi return Navigator( key: navigatorKey, onPopPage: (route, result) { - debugPrint("onPopPage> $route"); if (!route.didPop(result)) { return false; } diff --git a/packages/you_flutter/test/better_ui_test.dart b/packages/you_flutter/test/better_ui_test.dart index 475a1f2f..0c081af5 100644 --- a/packages/you_flutter/test/better_ui_test.dart +++ b/packages/you_flutter/test/better_ui_test.dart @@ -3,7 +3,7 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:you_flutter/src/better_ui.dart'; void main() { - group("ToRouter.parse ok", () { + group("YouRouter.parse ok", () { test('select() 所有档位都覆盖,测一下', () { assertScreen(ScreenSize screen) { // 用此档位的最小宽度+1,来模仿此屏幕大小 diff --git a/packages/you_flutter/test/router_to_test.dart b/packages/you_flutter/test/router_to_test.dart index 7278bbc8..4bb9b9da 100644 --- a/packages/you_flutter/test/router_to_test.dart +++ b/packages/you_flutter/test/router_to_test.dart @@ -5,7 +5,7 @@ import 'package:you_flutter/src/router.dart'; void main() { WidgetsFlutterBinding.ensureInitialized(); - group("ToRouter.parse ok", () { + group("YouRouter.parse ok", () { var router = YouRouter( initial: Uri.parse("/"), navigatorKey: GlobalKey(), @@ -81,7 +81,7 @@ void main() { match("/chen56", expected: (location: "/[user]", routeParameters: {"user": "chen56"})); }); }); - group("ToRouter.parse 404", () { + group("YouRouter.parse 404", () { var router = YouRouter( initial: Uri.parse("/"), navigatorKey: GlobalKey(), diff --git a/packages/you_note_dart/lib/note.dart b/packages/you_note_dart/lib/note.dart index 941673c0..999e8d29 100644 --- a/packages/you_note_dart/lib/note.dart +++ b/packages/you_note_dart/lib/note.dart @@ -1,6 +1,6 @@ library note; -export 'src/note.dart' show ToNote, Cell, NoteBuilder, LazyNoteBuilder, NoteSystem; +export 'src/note.dart' show ToNote, Cell, NoteBuilder,NoteLayoutBuilder, NoteSystem; export 'src/contents/contents.dart' show contents; export 'src/contents/mockup.dart' show MockupWindow; export 'src/contents/markdown_content.dart' show MD; diff --git a/packages/you_note_dart/lib/src/layouts/note_layout_default.dart b/packages/you_note_dart/lib/src/layouts/note_layout_default.dart index 1ca89e0a..b7280d0e 100644 --- a/packages/you_note_dart/lib/src/layouts/note_layout_default.dart +++ b/packages/you_note_dart/lib/src/layouts/note_layout_default.dart @@ -4,10 +4,10 @@ import 'package:you_flutter/state.dart'; import 'package:you_note_dart/note.dart'; final class NoteLayoutDefault extends StatelessWidget { - final Cell rootCell; + final NoteBuilder builder; final ToUri uri; - const NoteLayoutDefault({super.key, required this.uri, required this.rootCell}); + const NoteLayoutDefault({super.key, required this.uri, required this.builder}); @override Widget build(BuildContext context) { @@ -17,6 +17,8 @@ final class NoteLayoutDefault extends StatelessWidget { /// Watch是you_flutter的state管理组件, 被其包裹的状态可以被观测刷新(ref: Cell._contents = [].signal()) child: Watch((context) { // contents是收集到调用print(xx)的所有结果 + Cell rootCell = Cell.empty(); + builder(context, rootCell); var pageContents = rootCell.toList().expand((cell) sync* { for (var content in cell.contents) { yield Align( diff --git a/packages/you_note_dart/lib/src/layouts/note_layout_style_1.dart b/packages/you_note_dart/lib/src/layouts/note_layout_style_1.dart index dc1b08ff..1f25f57f 100644 --- a/packages/you_note_dart/lib/src/layouts/note_layout_style_1.dart +++ b/packages/you_note_dart/lib/src/layouts/note_layout_style_1.dart @@ -7,10 +7,10 @@ import 'package:you_note_dart/src/note.dart'; /// 一个极简的笔记布局范例 /// 左边routes树,右边页面内容 final class NoteLayoutStyle1 extends StatelessWidget { - final Cell cell; + final NoteBuilder builder; final ToUri uri; - NoteLayoutStyle1({super.key, required this.uri, required this.cell}); + NoteLayoutStyle1({super.key, required this.uri, required this.builder}); @override Widget build(BuildContext context) { @@ -20,6 +20,8 @@ final class NoteLayoutStyle1 extends StatelessWidget { /// Watch是you_flutter的state管理组件, 被其包裹的状态可以被观测刷新(ref: Cell._contents = [].signal()) child: Watch((context) { // contents是收集到调用print(xx)的所有结果 + Cell cell = Cell.empty(); + builder(context, cell); var pageContents = cell.toList().expand((cell) sync* { for (var content in cell.contents) { yield Align( diff --git a/packages/you_note_dart/lib/src/note.dart b/packages/you_note_dart/lib/src/note.dart index b252f0dd..d50e8207 100644 --- a/packages/you_note_dart/lib/src/note.dart +++ b/packages/you_note_dart/lib/src/note.dart @@ -12,8 +12,8 @@ import 'package:http/http.dart' as http; import 'package:you_note_dart/src/layouts/note_layout_default.dart'; typedef NoteBuilder = void Function(BuildContext context, Cell print); -typedef LazyNoteBuilder = Future Function(BuildContext context, Cell print); -typedef NoteLayoutBuilder = Widget Function(BuildContext context, ToUri uri, Cell cell); +// TODO REMOVE typedef LazyNoteBuilder = Future Function(BuildContext context, Cell print); +typedef NoteLayoutBuilder = Widget Function(BuildContext context, ToUri uri, NoteBuilder builder); base class ToNote extends To { final NoteBuilder? _builder; @@ -22,23 +22,39 @@ base class ToNote extends To { ToNote(super.part, {NoteBuilder? builder, NoteLayoutBuilder? layout, List children = const []}) : _builder = builder, _layout = layout, - super(children: children); + super( + // builder: builder == null + // ? null + // : (context, uri) { + // Cell rootCell = Cell.empty(); + // builder(context, rootCell); + // // To? find = findLayoutNode(); + // // if (find == null) { + // // return NoteLayoutDefault(uri: uri, rootCell: rootCell); + // // } + // return Text(""); + // }, + // layout: layout == null + // ? null + // : (context, uri, pageBuilder) { + // var child = pageBuilder(context, uri); + // return layout(context, uri, child); + // }, + children: children); Widget? build(BuildContext context, ToUri uri) { if (_builder == null) { return null; } - Cell rootCell = Cell.empty(); - _builder(context, rootCell); - To? find = findLayoutNode(); if (find == null) { - return NoteLayoutDefault(uri: uri, rootCell: rootCell); + return NoteLayoutDefault(uri: uri, builder: _builder); } - return (find as ToNote)._layout!(context, uri, rootCell); + return (find as ToNote)._layout!(context, uri, _builder); } } +@Deprecated("已被you_router取代,待删除") class NoteRoute { /// A file system term, that refers to the last part of a path /// example: a/b/c , c is basename @@ -47,25 +63,13 @@ class NoteRoute { final NoteRoute? parent; bool expand = false; - @internal - LazyNoteBuilder? lazyNoteBuilder; - NoteConf? conf; - NoteRoute._child({required this.basename, required NoteRoute this.parent}); NoteRoute.root() : basename = "", parent = null; - NoteRoute put(String fullPath, LazyNoteBuilder lazyNoteBuilder) { - var p = fullPath.split("/").map((e) => e.trim()).where((e) => e.isNotEmpty).toList(); - var path = _ensurePath(p); - - path.lazyNoteBuilder = lazyNoteBuilder; - return path; - } - void configTree({int extendLevel = 0}) { if (extendLevel <= 0) return; @@ -77,20 +81,6 @@ class NoteRoute { List get children => List.from(_children.values); - NoteRoute _ensurePath(List nameList) { - if (nameList.isEmpty) { - return this; - } - String name = nameList[0]; - assert(name != "" && name != "/", "path:$nameList, path[0]:'$name' must not be '' and '/' "); - var next = _children.putIfAbsent(name, () { - var child = NoteRoute._child(basename: name, parent: this); - _children[name] = child; - return child; - }); - return next._ensurePath(nameList.sublist(1)); - } - bool get isLeaf => _children.isEmpty; int get level => isRoot ? 0 : parent!.level + 1;