From b27c6f6c14c3e1611c4ffc8ea691cc09213a3068 Mon Sep 17 00:00:00 2001 From: Chen Peng Date: Tue, 30 Apr 2024 23:14:29 +0800 Subject: [PATCH] =?UTF-8?q?=E5=87=86=E5=A4=87=E8=AF=95=E8=AF=95ForPage=20r?= =?UTF-8?q?ename=20to=20Page?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notes/flutter_web/lib/routes.g.dart | 166 +++++++++--------- .../flutter_web/lib/routes/notes/layout.dart | 2 +- packages/you_cli/bin/cli.dart | 53 +++--- packages/you_cli/lib/src/cli_core.dart | 37 ++-- packages/you_cli/test/bin/cli_core_test.dart | 2 +- packages/you_flutter/lib/router.dart | 2 +- packages/you_flutter/lib/src/router.dart | 73 +++++++- packages/you_note_dart/lib/note.dart | 2 +- packages/you_note_dart/lib/src/note.dart | 66 ++++--- 9 files changed, 246 insertions(+), 157 deletions(-) diff --git a/notes/flutter_web/lib/routes.g.dart b/notes/flutter_web/lib/routes.g.dart index e310cf6b..01df02b0 100644 --- a/notes/flutter_web/lib/routes.g.dart +++ b/notes/flutter_web/lib/routes.g.dart @@ -66,109 +66,109 @@ import 'package:flutter_web/routes/notes/Improve_app/RepaintBoundary/page.dart' import 'package:flutter_web/routes/notes/Improve_app/event&listener&lifeycle/page.dart' as _event_listener_lifeycle_page; mixin RoutesMixin { - final To root = To('routes', builder: build, children: [ - ToNote('notes', builder: _notes_page.build, layout: layout, children: [ - ToNote('research', children: [ - ToNote('bash_note'), - ToNote('parameterized', builder: _parameterized_page.build), - ToNote('remote_view', builder: _remote_view_page.build), + final To root = ForPage('routes', page: build).route(children: [ + Note('notes', page: _notes_page.build, layout: layout).route(children: [ + Note('research').route(children: [ + Note('bash_note').route(), + Note('parameterized', page: _parameterized_page.build).route(), + Note('remote_view', page: _remote_view_page.build).route(), ]), - ToNote('env_info', builder: _env_info_page.build), - ToNote('layout', builder: _layout_page.build, children: [ - ToNote('old', children: [ - ToNote('layout', builder: _layout_page2.build), + Note('env_info', page: _env_info_page.build).route(), + Note('layout', page: _layout_page.build).route(children: [ + Note('old').route(children: [ + Note('layout', page: _layout_page2.build).route(), ]), - ToNote('box_layout', children: [ - ToNote('constraints', builder: _constraints_page.build), + Note('box_layout').route(children: [ + Note('constraints', page: _constraints_page.build).route(), ]), - ToNote('responsive_design', builder: _responsive_design_page.build), - ToNote('1.welcome'), + Note('responsive_design', page: _responsive_design_page.build).route(), + Note('1.welcome').route(), ]), - ToNote('navigation', builder: _navigation_page.build, children: [ - ToNote('navigator_v1'), - ToNote('navigator_v2'), + Note('navigation', page: _navigation_page.build).route(children: [ + Note('navigator_v1').route(), + Note('navigator_v2').route(), ]), - ToNote('state', builder: _state_page.build, children: [ - ToNote('1.vanilla_state', builder: _1_vanilla_state_page.build), - ToNote('StatefulBuilder', builder: _StatefulBuilder_page.build), + Note('state', page: _state_page.build).route(children: [ + Note('1.vanilla_state', page: _1_vanilla_state_page.build).route(), + Note('StatefulBuilder', page: _StatefulBuilder_page.build).route(), ]), - ToNote('media&assets&file', children: [ - ToNote('file_desktop', builder: _file_desktop_page.build), - ToNote('file_web', builder: _file_web_page.build), - ToNote('assets', builder: _assets_page.build), + Note('media&assets&file').route(children: [ + Note('file_desktop', page: _file_desktop_page.build).route(), + Note('file_web', page: _file_web_page.build).route(), + Note('assets', page: _assets_page.build).route(), ]), - ToNote('style&theming', children: [ - ToNote('material3', builder: _material3_page.build), - ToNote('Material'), + Note('style&theming').route(children: [ + Note('material3', page: _material3_page.build).route(), + Note('Material').route(), ]), - ToNote('pure_dart', children: [ - ToNote('dart3', builder: _dart3_page.build), - ToNote('async', builder: _async_page.build), - ToNote('safe_interface', builder: _safe_interface_page.build), - ToNote('execption', builder: _execption_page.build), - ToNote('serialization_json', builder: _serialization_json_page.build), - ToNote('analyzer', builder: _analyzer_page.build), + Note('pure_dart').route(children: [ + Note('dart3', page: _dart3_page.build).route(), + Note('async', page: _async_page.build).route(), + Note('safe_interface', page: _safe_interface_page.build).route(), + Note('execption', page: _execption_page.build).route(), + Note('serialization_json', page: _serialization_json_page.build).route(), + Note('analyzer', page: _analyzer_page.build).route(), ]), - ToNote('dev', children: [ - ToNote('host_mirror', builder: _host_mirror_page.build), - ToNote('macos_config', builder: _macos_config_page.build), - ToNote('devtool', builder: _devtool_page.build, children: [ - ToNote('vmservice', builder: _vmservice_page.build), + Note('dev').route(children: [ + Note('host_mirror', page: _host_mirror_page.build).route(), + Note('macos_config', page: _macos_config_page.build).route(), + Note('devtool', page: _devtool_page.build).route(children: [ + Note('vmservice', page: _vmservice_page.build).route(), ]), - ToNote('debug', builder: _debug_page.build), + Note('debug', page: _debug_page.build).route(), ]), - ToNote('i18n', builder: _i18n_page.build), - ToNote('thinking_in_ui', children: [ - ToNote('readable_html_vs_dart', builder: _readable_html_vs_dart_page.build), + Note('i18n', page: _i18n_page.build).route(), + Note('thinking_in_ui').route(children: [ + Note('readable_html_vs_dart', page: _readable_html_vs_dart_page.build).route(), ]), - ToNote('x.note_inside', children: [ - ToNote('how_note_work', builder: _how_note_work_page.build), - ToNote('note_api_thinking'), - ToNote('mockup_content', builder: _mockup_content_page.build), - ToNote('1.welcome', builder: _1_welcome_page.build), - ToNote('note_test_self', builder: _note_test_self_page.build, children: [ - ToNote('nobody', builder: _nobody_page.build), + Note('x.note_inside').route(children: [ + Note('how_note_work', page: _how_note_work_page.build).route(), + Note('note_api_thinking').route(), + Note('mockup_content', page: _mockup_content_page.build).route(), + Note('1.welcome', page: _1_welcome_page.build).route(), + Note('note_test_self', page: _note_test_self_page.build).route(children: [ + Note('nobody', page: _nobody_page.build).route(), ]), ]), - ToNote('widgets', children: [ - ToNote('specific_widgets', children: [ - ToNote('input', builder: _input_page.build), - ToNote('webview', builder: _webview_page.build), - ToNote('slider', builder: _slider_page.build), - ToNote('selectable', builder: _selectable_page.build), - ToNote('button', children: [ - ToNote('ButtonStyleButton', builder: _ButtonStyleButton_page.build), - ToNote('FloatingActionButton', builder: _FloatingActionButton_page.build), - ToNote('IconButton', builder: _IconButton_page.build), - ToNote('overview', builder: _overview_page.build), + Note('widgets').route(children: [ + Note('specific_widgets').route(children: [ + Note('input', page: _input_page.build).route(), + Note('webview', page: _webview_page.build).route(), + Note('slider', page: _slider_page.build).route(), + Note('selectable', page: _selectable_page.build).route(), + Note('button').route(children: [ + Note('ButtonStyleButton', page: _ButtonStyleButton_page.build).route(), + Note('FloatingActionButton', page: _FloatingActionButton_page.build).route(), + Note('IconButton', page: _IconButton_page.build).route(), + Note('overview', page: _overview_page.build).route(), ]), - ToNote('Divider'), - ToNote('text', children: [ - ToNote('RichText', builder: _RichText_page.build), - ToNote('Text', builder: _Text_page.build), + Note('Divider').route(), + Note('text').route(children: [ + Note('RichText', page: _RichText_page.build).route(), + Note('Text', page: _Text_page.build).route(), ]), - ToNote('icon', builder: _icon_page.build), + Note('icon', page: _icon_page.build).route(), ]), - ToNote('container_widgets', children: [ - ToNote('drawer'), - ToNote('Card'), - ToNote('app'), - ToNote('dialog'), - ToNote('menu', builder: _menu_page.build), - ToNote('scrollable', children: [ - ToNote('Dismissible', builder: _Dismissible_page.build), - ToNote('DraggableScrollableSheet'), + Note('container_widgets').route(children: [ + Note('drawer').route(), + Note('Card').route(), + Note('app').route(), + Note('dialog').route(), + Note('menu', page: _menu_page.build).route(), + Note('scrollable').route(children: [ + Note('Dismissible', page: _Dismissible_page.build).route(), + Note('DraggableScrollableSheet').route(), ]), - ToNote('page_view'), - ToNote('bar', builder: _bar_page.build), + Note('page_view').route(), + Note('bar', page: _bar_page.build).route(), ]), ]), - ToNote('Improve_app', builder: _Improve_app_page.build, children: [ - ToNote('1.overview', builder: _1_overview_page.build), - ToNote('error_handle'), - ToNote('web_optimization', builder: _web_optimization_page.build), - ToNote('RepaintBoundary', builder: _RepaintBoundary_page.build), - ToNote('event&listener&lifeycle', builder: _event_listener_lifeycle_page.build), + Note('Improve_app', page: _Improve_app_page.build).route(children: [ + Note('1.overview', page: _1_overview_page.build).route(), + Note('error_handle').route(), + Note('web_optimization', page: _web_optimization_page.build).route(), + Note('RepaintBoundary', page: _RepaintBoundary_page.build).route(), + Note('event&listener&lifeycle', page: _event_listener_lifeycle_page.build).route(), ]), ]), ]); diff --git a/notes/flutter_web/lib/routes/notes/layout.dart b/notes/flutter_web/lib/routes/notes/layout.dart index a5806223..f5814490 100644 --- a/notes/flutter_web/lib/routes/notes/layout.dart +++ b/notes/flutter_web/lib/routes/notes/layout.dart @@ -4,7 +4,7 @@ import 'package:you_note_dart/note.dart'; import 'package:you_note_dart/note_layouts.dart'; /// [NoteLayoutBuilder] -@ToType(type: ToNote) +@ToType(type: Note) Widget layout(BuildContext context, NoteBuilder builder) { // ignore: unnecessary_type_check assert(layout is NoteLayoutBuilder); diff --git a/packages/you_cli/bin/cli.dart b/packages/you_cli/bin/cli.dart index 7059dd17..42455b16 100644 --- a/packages/you_cli/bin/cli.dart +++ b/packages/you_cli/bin/cli.dart @@ -118,16 +118,25 @@ class Cmd_gen_routes_g_dart extends Command { } } - Expression _genRouteRootExpression(RouteNode node) { - var toType = node.findToType(); - return toType.newInstance([ - literalString(node.dir.basename) - ], { - if (node.file_page_dart.existsSync()) "builder": refer("build",node.pagePackageUrl), - if (node.file_layout_dart.existsSync()) "layout": refer("layout",node.layoutPackageUrl), - if (node.children.isNotEmpty) "children": literalList(node.children.map((e) => _genRouteRootExpression(e))), - }); + var builderType = node.findForBuildType(); + return builderType + .newInstance( + [literalString(node.dir.basename)], + { + if (node.file_page_dart.existsSync()) "page": refer("build", node.pagePackageUrl), + if (node.file_layout_dart.existsSync()) "layout": refer("layout", node.layoutPackageUrl), + }, + ) + .property("route") + .call([], { + if (node.children.isNotEmpty) "children": literalList(node.children.map((e) => _genRouteRootExpression(e))), + }); + + // YouCli.toType.newInstance([ + // ], { + // if (node.children.isNotEmpty) "children": literalList(node.children.map((e) => _genRouteRootExpression(e))), + // }); } @override @@ -145,7 +154,7 @@ class Cmd_gen_routes_g_dart extends Command { Iterable routes = rootRoute.toList(); Library all = Library( - (b) => b + (b) => b ..generatedByComment = """ // Generated by https://github.com/chen56/you // - This file setup routes tree and strong type `routes` reference @@ -175,33 +184,31 @@ class Cmd_gen_routes_g_dart extends Command { // ) ..body.add( Mixin( - (b) => b + (b) => b ..name = "RoutesMixin" ..fields.add( Field((f) => f ..name = "root" ..modifier = FieldModifier.final$ - ..type = rootRoute.findToType() + ..type = YouCli.toType ..assignment = _genRouteRootExpression(rootRoute).code), ) ..fields.addAll( routes.where((e) => e.file_page_dart.existsSync()).map( (routeDir) => Field((f) => f - ..modifier = FieldModifier.final$ - ..late = true - ..type = YouCli.toTypeDefault - ..name = "routes_${routeDir.flatName}" - ..assignment = refer("root.find").call([literalString(routeDir.routePath)]).nullChecked.code), - ), + ..modifier = FieldModifier.final$ + ..late = true + ..type = YouCli.toType + ..name = "routes_${routeDir.flatName}" + ..assignment = refer("root.find").call([literalString(routeDir.routePath)]).nullChecked.code), + ), ), ), ) ..body.add( - Class( - (b) => b - ..name = "Routes" - ..mixins.add(refer("RoutesMixin")) - ), + Class((b) => b + ..name = "Routes" + ..mixins.add(refer("RoutesMixin"))), ), ); diff --git a/packages/you_cli/lib/src/cli_core.dart b/packages/you_cli/lib/src/cli_core.dart index ce65e124..6855d62b 100644 --- a/packages/you_cli/lib/src/cli_core.dart +++ b/packages/you_cli/lib/src/cli_core.dart @@ -16,7 +16,8 @@ class YouCli { : dir_project = projectDir.fileSystem.directory(path.normalize(path.absolute(projectDir.path))), fs = projectDir.fileSystem; - static const Reference toTypeDefault = Reference("To", "package:you_flutter/router.dart"); + static const Reference toType = Reference("To", "package:you_flutter/router.dart"); + static const Reference forPageType = Reference("ForPage", "package:you_flutter/router.dart"); static const String toTypeName = "ToType"; static const String pageDart = "page.dart"; static const String layoutDart = "layout.dart"; @@ -47,13 +48,13 @@ class YouCli { } var children = await Future.wait(dir.listSync(recursive: false).whereType().map((e) async => await from(e))); - var (layout: layoutFunction, toType: toType) = await analysisLayout(dir.childFile(layoutDart)); + var (layout: layoutFunction, forBuildType: forBuildType) = await analysisLayout(dir.childFile(layoutDart)); return RouteNode( cli: this, dir: dir, pageBuild: await analysisPage(dir.childFile(pageDart)), layoutFunction: layoutFunction, - toType: toType, + forBuildType: forBuildType, children: children, ); } @@ -80,15 +81,15 @@ class YouCli { return toFind.library!; } - Future<({FunctionElement? layout, Reference? toType})> analysisLayout(File file) async { + Future<({FunctionElement? layout, Reference? forBuildType})> analysisLayout(File file) async { if (!await file.exists()) { - return (layout: null, toType: null); + return (layout: null, forBuildType: null); } var layoutLib = (await analysisSession.getResolvedLibrary(path.normalize(path.absolute(file.path))) as ResolvedLibraryResult).element; FunctionElement? layoutFunction = layoutLib.definingCompilationUnit.functions.where((e) => e.name == layoutFunctionName).firstOrNull; if (layoutFunction == null) { - return (layout: null, toType: null); + return (layout: null, forBuildType: null); } var findToTypeAnno = layoutFunction.metadata.map((e) => e.computeConstantValue()).where((e) { var t = e?.type; @@ -104,26 +105,26 @@ class YouCli { } // result?.type?.element?.library?.children var publicExportFrom = findPublicExportLib(element, layoutLib); - return publicExportFrom?.identifier == toTypeDefault.type.url; + return publicExportFrom?.identifier == forPageType.type.url; }).firstOrNull; if (findToTypeAnno == null) { - return (layout: layoutFunction, toType: null); + return (layout: layoutFunction, forBuildType: null); } var type = findToTypeAnno.getField("type")?.toTypeValue(); if (type == null) { - return (layout: layoutFunction, toType: toTypeDefault); + return (layout: layoutFunction, forBuildType: forPageType); } var symbol = type.getDisplayString(withNullability: false); if (symbol == "") { - return (layout: layoutFunction, toType: toTypeDefault); + return (layout: layoutFunction, forBuildType: forPageType); } var publicExportFrom = findPublicExportLib(type.element! as TypeDefiningElement, layoutLib); var url = publicExportFrom?.identifier; - return (layout: layoutFunction, toType: refer(symbol, url)); + return (layout: layoutFunction, forBuildType: refer(symbol, url)); } Future analysisPage(File file) async { @@ -139,12 +140,12 @@ class RouteNode { final YouCli cli; final List children; final Directory dir; - final Reference? toType; + final Reference? forBuildType; final FunctionElement? layoutFunction; final FunctionElement? pageBuild; late RouteNode _parent = this; - RouteNode({required this.dir, this.toType, required this.children, this.layoutFunction, this.pageBuild, required this.cli}) { + RouteNode({required this.dir, this.forBuildType, required this.children, this.layoutFunction, this.pageBuild, required this.cli}) { for (var child in children) { child._parent = this; } @@ -230,13 +231,13 @@ class RouteNode { return _parent.findLayoutSync(); } - Reference findToType() { - if (toType != null) { - return toType!; + Reference findForBuildType() { + if (forBuildType != null) { + return forBuildType!; } if (isRoot) { - return YouCli.toTypeDefault; + return YouCli.forPageType; } - return _parent.findToType(); + return _parent.findForBuildType(); } } diff --git a/packages/you_cli/test/bin/cli_core_test.dart b/packages/you_cli/test/bin/cli_core_test.dart index 6c071729..c99247a9 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).equals(refer("ToNote","package:you_note_dart/note.dart")); + check(result.forBuildType).equals(refer("ToNote","package:you_note_dart/note.dart")); }); }); diff --git a/packages/you_flutter/lib/router.dart b/packages/you_flutter/lib/router.dart index 0e9a02db..a285d2ba 100644 --- a/packages/you_flutter/lib/router.dart +++ b/packages/you_flutter/lib/router.dart @@ -1,4 +1,4 @@ library you_router; -export 'package:you_flutter/src/router.dart' show YouRouter,To,ToUri,PageBuilder,LazyPageBuilder,PageLayoutBuilder; +export 'package:you_flutter/src/router.dart' show YouRouter,To,ToUri,ForBuild,ForPage,PageBuilder,LazyPageBuilder,PageLayoutBuilder; export 'package:you_flutter/src/router_core.dart' show ToType; diff --git a/packages/you_flutter/lib/src/router.dart b/packages/you_flutter/lib/src/router.dart index 69daf55f..a7cc7611 100644 --- a/packages/you_flutter/lib/src/router.dart +++ b/packages/you_flutter/lib/src/router.dart @@ -3,6 +3,7 @@ import 'dart:collection'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/material.dart' as material; import 'package:meta/meta.dart'; import 'package:path/path.dart' as path_; import 'package:you_flutter/src/layouts/page_layout_default.dart'; @@ -146,6 +147,53 @@ enum RoutePartType { } } +abstract base class ForBuild { + final String part; + + ForBuild(this.part); + + To route({List children = const []}) { + return To.create(part, forBuild: this, children: children); + } + + Widget buildPage(BuildContext context, ForBuild forPage, ToUri uri); + + Widget buildNotFound(BuildContext context, ForBuild forNotFound, ToUri uri); + + bool get hasPage; + + bool get hasLayout; + + bool get hasNotFound; +} + +base class ForPage extends ForBuild { + final PageBuilder? page; + final PageBuilder? notFound; + final PageLayoutBuilder? layout; + + ForPage(super.part, {this.page, this.layout, this.notFound}); + + @override + Widget buildPage(BuildContext context, covariant ForPage forPage, ToUri uri) { + return layout!(context, forPage.page!); + } + + @override + Widget buildNotFound(BuildContext context, covariant ForPage forNotFound, ToUri uri) { + return layout!(context, forNotFound.notFound!); + } + + @override + bool get hasPage => page != null; + + @override + bool get hasLayout => layout != null; + + @override + bool get hasNotFound => notFound != null; +} + /// To == go_router.GoRoute /// 官方的go_router内部略显复杂,且没有我们想要的layout等功能,所以自定一个简化版的to_router base class To { @@ -166,10 +214,12 @@ base class To { final PageBuilder? _builder; final PageLayoutBuilder? _layout; + final ForBuild? forBuild; // TODO P1 root Node的part是routes,有问题! To( this.part, { + this.forBuild, PageBuilder? builder, PageLayoutBuilder? layout, this.children = const [], @@ -185,21 +235,26 @@ base class To { } } - To.lazy( - String part, { - LazyPageBuilder? builder, - List children = const [], - }) : this( - part, - builder: _asyncToSync(builder), - children: children, - ); + To.create(this.part, {required this.forBuild, required this.children}) + : _builder = null, + _layout = null; + + // To.lazy( + // String part, { + // LazyPageBuilder? builder, + // List children = const [], + // }) : this( + // part, + // builder: _asyncToSync(builder), + // children: children, + // ); To get parent => _parent; @mustBeOverridden bool get isValid => _builder != null; + // ignore: unused_element static PageBuilder? _asyncToSync(LazyPageBuilder? builder) { if (builder == null) { return null; diff --git a/packages/you_note_dart/lib/note.dart b/packages/you_note_dart/lib/note.dart index 999e8d29..42a978b0 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,NoteLayoutBuilder, NoteSystem; +export 'src/note.dart' show Note, 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/note.dart b/packages/you_note_dart/lib/src/note.dart index 5b2f5218..da3ee064 100644 --- a/packages/you_note_dart/lib/src/note.dart +++ b/packages/you_note_dart/lib/src/note.dart @@ -9,37 +9,62 @@ import 'package:you_flutter/state.dart'; import 'package:you_note_dart/note_conf.dart'; import 'package:you_note_dart/src/conventions.dart'; 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 NoteLayoutBuilder = Widget Function(BuildContext context, NoteBuilder builder); -base class ToNote extends To { - final NoteBuilder? _builder; - final NoteLayoutBuilder? _layout; +base class Note extends ForBuild { + final NoteBuilder? page; + final NoteBuilder? notFound; + final NoteLayoutBuilder? layout; - ToNote(super.part, {NoteBuilder? builder, NoteLayoutBuilder? layout, List children = const []}) - : _builder = builder, - _layout = layout, - super(children: children); + Note(super.part, {this.page, this.layout, this.notFound}); @override - bool get isValid => _builder!=null; + Widget buildPage(BuildContext context, covariant Note forPage, ToUri uri) { + return layout!(context, forPage.page!); + } @override - Widget build(BuildContext context, ToUri uri) { - if (_builder == null) { - // TODO not found - return Text("not found $uri"); - } - List chain = [this, ...findAncestorsOfSameType()]; - for (var i in chain) { - if (i._layout != null) return i._layout(context, _builder); - } - return NoteLayoutDefault(uri: uri, builder: _builder); + Widget buildNotFound(BuildContext context, covariant Note forNotFound, ToUri uri) { + return layout!(context, forNotFound.notFound!); } + @override + bool get hasPage => page != null; + + @override + bool get hasLayout => layout != null; + + @override + bool get hasNotFound => notFound != null; } +// +// base class ToNote extends To { +// final NoteBuilder? _builder; +// final NoteLayoutBuilder? _layout; +// +// ToNote(super.part, {NoteBuilder? builder, NoteLayoutBuilder? layout, List children = const []}) +// : _builder = builder, +// _layout = layout, +// super(part,forBuild:this,children: children); +// +// @override +// bool get isValid => _builder != null; +// +// @override +// Widget build(BuildContext context, ToUri uri) { +// if (_builder == null) { +// // TODO not found +// return Text("not found $uri"); +// } +// List chain = [this, ...findAncestorsOfSameType()]; +// for (var i in chain) { +// if (i._layout != null) return i._layout(context, _builder); +// } +// return NoteLayoutDefault(uri: uri, builder: _builder); +// } +// } @Deprecated("已被you_router取代,待删除") class NoteRoute { @@ -233,7 +258,8 @@ class NoteSystem { } base class Cell { - Cell(Function(Cell print) callback, { + Cell( + Function(Cell print) callback, { this.title, }) { callback(this);