diff --git a/assets/flutter.db b/assets/flutter.db index 4b63520..f331e6e 100644 Binary files a/assets/flutter.db and b/assets/flutter.db differ diff --git a/lib/blocs/detail/detail_bloc.dart b/lib/blocs/detail/detail_bloc.dart index e1b57f9..222db29 100644 --- a/lib/blocs/detail/detail_bloc.dart +++ b/lib/blocs/detail/detail_bloc.dart @@ -16,7 +16,7 @@ class DetailBloc extends Bloc { DetailBloc({@required this.repository}); @override - DetailState get initialState => DetailEmpty(); + DetailState get initialState => DetailLoading(); @override Stream mapEventToState(DetailEvent event) async* { @@ -24,17 +24,22 @@ class DetailBloc extends Bloc { yield* _mapLoadWidgetToState(event.widgetModel); } if(event is ResetDetailState){ - yield DetailEmpty(); + yield DetailLoading(); } } Stream _mapLoadWidgetToState( WidgetModel widgetModel) async* { + yield DetailLoading(); try { final nodes = await this.repository.loadNode(widgetModel); final links = await this.repository.loadWidget(widgetModel.links); - yield DetailWithData( - widgetModel: widgetModel, nodes: nodes,links: links); + if(nodes.isEmpty){ + yield DetailEmpty(); + }else{ + yield DetailWithData(widgetModel: widgetModel, nodes: nodes,links: links); + } + } catch (_) { yield DetailFailed(); } diff --git a/lib/blocs/detail/detail_state.dart b/lib/blocs/detail/detail_state.dart index 445436f..f66c351 100644 --- a/lib/blocs/detail/detail_state.dart +++ b/lib/blocs/detail/detail_state.dart @@ -32,5 +32,6 @@ class DetailWithData extends DetailState { } +class DetailLoading extends DetailState {} class DetailEmpty extends DetailState {} class DetailFailed extends DetailState {} \ No newline at end of file diff --git a/lib/views/pages/detail/widget_detail_page.dart b/lib/views/pages/detail/widget_detail_page.dart index c2b1643..5019126 100644 --- a/lib/views/pages/detail/widget_detail_page.dart +++ b/lib/views/pages/detail/widget_detail_page.dart @@ -90,7 +90,6 @@ class _WidgetDetailPageState extends State { child: Padding( padding: const EdgeInsets.all(15.0), child: BlocBuilder(builder: (_, state) { - print('build---${state.runtimeType}---'); if (state is DetailWithData) { return Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -126,7 +125,6 @@ class _WidgetDetailPageState extends State { ], ), BlocBuilder(builder: (_, state) { - print('build---${state.runtimeType}---'); if (state is DetailWithData) { return Column( crossAxisAlignment: CrossAxisAlignment.start, diff --git a/lib/views/widgets/ProxyWidget/ChipTheme/node1_base.dart b/lib/views/widgets/ProxyWidget/ChipTheme/node1_base.dart new file mode 100644 index 0000000..013cd2b --- /dev/null +++ b/lib/views/widgets/ProxyWidget/ChipTheme/node1_base.dart @@ -0,0 +1,76 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/20 +/// contact me by email 1981462002@qq.com +/// 说明: 328 ChipTheme 主要用于为后代的Chip类型组件统一设置默认属性,也可以通过该组件获取默认Chip的属性。 +// { +// "widgetId": 328, +// "name": 'ChipTheme基本使用', +// "priority": 1, +// "subtitle": "可指定ChipThemeData数据属性为【后代】的Chip类型组件设置默认样式,属性和Chip属性类似,如阴影、颜色、边距、形状、文字样式等。也可以用ChipTheme.of获取Chip的主题数据。", +// } +class ChipThemeDemo extends StatelessWidget { + @override + Widget build(BuildContext context) { + return ChipTheme( + data: ChipTheme.of(context).copyWith( + selectedColor: Colors.orange.withAlpha(55), + selectedShadowColor: Colors.blue, + shadowColor: Colors.orangeAccent, + pressElevation: 5, + elevation: 3, + ), + child: CustomFilterChip(), + ); + } +} + +class CustomFilterChip extends StatefulWidget { + @override + _CustomFilterChipState createState() => _CustomFilterChipState(); +} + +class _CustomFilterChipState extends State { + final Map map = { + 'A': 'Ant', + 'B': 'Bug', + 'C': 'Cat', + 'D': 'Dog', + }; + List _selected = []; + + @override + Widget build(BuildContext context) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Wrap( + children: map.keys.map((key) => _buildChild(key)).toList(), + ), + Container( + padding: EdgeInsets.all(10), + child: Text('您已选择: ${_selected.join(', ')}')), + ], + ); + } + + Padding _buildChild(String key) { + return Padding( + padding: const EdgeInsets.all(4.0), + child: FilterChip( + avatar: CircleAvatar(child: Text(key)), + label: Text(map[key]), + selected: _selected.contains(map[key]), + onSelected: (bool value) { + setState(() { + if (value) { + _selected.add(map[key]); + } else { + _selected.removeWhere((name) => name == map[key]); + } + }); + }, + ), + ); + } +} diff --git a/lib/views/widgets/ProxyWidget/ListTileTheme/node1_base.dart b/lib/views/widgets/ProxyWidget/ListTileTheme/node1_base.dart new file mode 100644 index 0000000..f3d65c8 --- /dev/null +++ b/lib/views/widgets/ProxyWidget/ListTileTheme/node1_base.dart @@ -0,0 +1,51 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/22 +/// contact me by email 1981462002@qq.com +/// 说明: 334 ListTileTheme 主要用于为后代的ListTile组件统一设置默认属性,也可以通过该组件获取默认ListTile的属性。 +// { +// "widgetId": 334, +// "name": "ListTileTheme基本使用", +// "priority": 1, +// "subtitle": "可指定ListTileThemeData数据属性为【后代】的ListTile组件设置默认样式,如样式、颜色、装饰、边距等。也可以用ListTileTheme.of获取ListTile的主题属性。", +// } + +class ListTileThemeDemo extends StatelessWidget { + @override + Widget build(BuildContext context) { + return ListTileTheme( + dense: false, + style: ListTileStyle.list, + selectedColor: Colors.blue, + contentPadding: EdgeInsets.only(left: 15,right: 15,top: 5,bottom: 5), + iconColor: Colors.purple, + textColor: Colors.orange, + child: _ListTileSimple(), + ); + } +} + +class _ListTileSimple extends StatefulWidget { + @override + _ListTileSimpleState createState() => _ListTileSimpleState(); +} + +class _ListTileSimpleState extends State<_ListTileSimple> { + bool _selected = false; + + @override + Widget build(BuildContext context) { + return Container( + margin: EdgeInsets.all(10), + color: Colors.grey.withAlpha(22), + child: ListTile( + leading: Image.asset("assets/images/icon_head.png"), + selected: _selected, + title: Text("以梦为马"), + subtitle: Text("海子"), + trailing: Icon(Icons.more_vert), + onTap: () => setState(() => _selected = !_selected), + ), + ); + } +} diff --git a/lib/views/widgets/ProxyWidget/MaterialBannerTheme/node1_base.dart b/lib/views/widgets/ProxyWidget/MaterialBannerTheme/node1_base.dart new file mode 100644 index 0000000..e535791 --- /dev/null +++ b/lib/views/widgets/ProxyWidget/MaterialBannerTheme/node1_base.dart @@ -0,0 +1,67 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/22 +/// contact me by email 1981462002@qq.com +/// 说明: 327 MaterialBannerTheme 主要用于为后代的MaterialBanner组件统一设置默认属性,也可以通过该组件获取默认MaterialBanner的属性。 +// { +// "widgetId": 327, +// "name": "MaterialBannerTheme基本使用", +// "priority": 1, +// "subtitle": "可指定MaterialBannerThemeData数据属性为【后代】的MaterialBanner组件设置默认样式,如背景色、边距、文字样式等。也可以用MaterialBannerTheme.of获取MaterialBanner的主题数据。", +// } +class MaterialBannerThemeDemo extends StatelessWidget { + @override + Widget build(BuildContext context) { + return MaterialBannerTheme( + data: MaterialBannerTheme.of(context).copyWith( + backgroundColor: Colors.purple, + padding: EdgeInsetsDirectional.only(start: 16.0, top: 2.0,end: 2), + leadingPadding:EdgeInsetsDirectional.only(end: 16.0) , + contentTextStyle: TextStyle(color: Colors.white), + ), + child: _MaterialBannerDemo(), + ); + } +} + + +class _MaterialBannerDemo extends StatelessWidget { + final info = + 'A banner displays an important, succinct message, and provides actions for users to address. ' + 'A user action is required for itto be dismissed.'; + + @override + Widget build(BuildContext context) { + return Column( + children: [MaterialBanner( + content: Text(info), + leading: Icon(Icons.warning, color: Colors.yellow), + actions: [ + RaisedButton( + color: Colors.white, + onPressed: () {}, + child: Text( + 'I KNOW', + style: TextStyle( + color: Colors.purple, + fontWeight: FontWeight.bold, + fontSize: 14), + ), + ), + + RaisedButton( + color: Colors.white, + onPressed: () {}, + child: Text( + 'I IGNORE', + style: TextStyle( + color: Colors.purple, + fontWeight: FontWeight.bold, + fontSize: 14), + ), + ), + ], + )], + ); + } +} \ No newline at end of file diff --git a/lib/views/widgets/ProxyWidget/PopupMenuTheme/node1_base.dart b/lib/views/widgets/ProxyWidget/PopupMenuTheme/node1_base.dart new file mode 100644 index 0000000..6a8837c --- /dev/null +++ b/lib/views/widgets/ProxyWidget/PopupMenuTheme/node1_base.dart @@ -0,0 +1,71 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/22 +/// contact me by email 1981462002@qq.com +/// 说明: 330 PopupMenuTheme 主要用于为后代的PopupMenuButton组件统一设置默认属性,也可以通过该组件获取默认PopupMenu的属性。 +// { +// "widgetId": 330, +// "name": "PopupMenuTheme基本使用", +// "priority": 1, +// "subtitle": "可指定PopupMenuThemeData数据属性为【后代】的PopupMenuButton组件设置默认样式,如形状、影深、颜色、文字样式等。也可以用PopupMenuTheme.of获取PopupMenu的主题数据。", +// } +class PopupMenuThemeDemo extends StatelessWidget { + @override + Widget build(BuildContext context) { + return PopupMenuTheme( + data: PopupMenuTheme.of(context).copyWith( + color: Colors.orangeAccent, + elevation: 1, + textStyle: TextStyle(color: Colors.white), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(20), + bottomRight: Radius.circular(20), + topRight: Radius.circular(5), + bottomLeft: Radius.circular(5), + )), + ), + child: _PopupMenuButtonSimple(), + ); + } +} + +class _PopupMenuButtonSimple extends StatefulWidget { + @override + _PopupMenuButtonSimpleState createState() => _PopupMenuButtonSimpleState(); +} + +class _PopupMenuButtonSimpleState extends State<_PopupMenuButtonSimple> { + final map = { + "关于": Icons.info_outline, + "帮助": Icons.help_outline, + "反馈": Icons.add_comment, + }; + + @override + Widget build(BuildContext context) { + return PopupMenuButton( + itemBuilder: (context) => buildItems(), + offset: Offset(0, 50), + onSelected: print, + onCanceled: () => print('onCanceled'), + ); + } + + List> buildItems() { + return map.keys + .toList() + .map((e) => PopupMenuItem( + value: e, + child: Wrap( + spacing: 6, + children: [ + Icon( + map[e], + ), + Text(e), + ], + ))) + .toList(); + } +} \ No newline at end of file diff --git a/lib/views/widgets/ProxyWidget/ToggleButtonsTheme/node1_base.dart b/lib/views/widgets/ProxyWidget/ToggleButtonsTheme/node1_base.dart new file mode 100644 index 0000000..3d0d16f --- /dev/null +++ b/lib/views/widgets/ProxyWidget/ToggleButtonsTheme/node1_base.dart @@ -0,0 +1,55 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/22 +/// contact me by email 1981462002@qq.com +/// 说明: 332 ToggleButtonsTheme 主要用于为后代的ToggleButtons组件统一设置默认属性,也可以通过该组件获取默认ToggleButtons的属性。 +// { +// "widgetId": 332, +// "name": "ToggleButtonsTheme基本使用", +// "priority": 1, +// "subtitle": "可指定ToggleButtonsThemeData数据属性为【后代】的ToggleButtons组件设置默认样式,如边框样式、颜色、装饰等。也可以用ToggleButtonsTheme.of获取ToggleButtons的主题数据。", +// } + +class ToggleButtonsThemeDemo extends StatelessWidget { + @override + Widget build(BuildContext context) { + return ToggleButtonsTheme( + data: ToggleButtonsTheme.of(context).copyWith( + borderWidth: 1, + borderColor: Colors.orangeAccent, + selectedBorderColor: Colors.blue, + splashColor: Colors.purple.withAlpha(66), + borderRadius: BorderRadius.circular(10), + selectedColor: Colors.red, + fillColor: Colors.green.withAlpha(11), + ), + child: _ToggleButtonsSimple(), + ); + } +} + + +class _ToggleButtonsSimple extends StatefulWidget { + @override + _ToggleButtonsSimpleState createState() => _ToggleButtonsSimpleState(); +} + +class _ToggleButtonsSimpleState extends State<_ToggleButtonsSimple> { + var _isSelected = [true, false, false]; + + @override + Widget build(BuildContext context) { + return ToggleButtons( + children: [ + Icon(Icons.skip_previous), + Icon(Icons.pause), + Icon(Icons.skip_next), + ], + isSelected: _isSelected, + onPressed: (value) => setState(() { + _isSelected = _isSelected.map((e) => false).toList(); + _isSelected[value] = true; + }), + ); + } +} \ No newline at end of file diff --git a/lib/views/widgets/SingleChildRenderObjectWidget/IntrinsicHeight/node1_base.dart b/lib/views/widgets/SingleChildRenderObjectWidget/IntrinsicHeight/node1_base.dart new file mode 100644 index 0000000..c9eaeec --- /dev/null +++ b/lib/views/widgets/SingleChildRenderObjectWidget/IntrinsicHeight/node1_base.dart @@ -0,0 +1,74 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/21 +/// contact me by email 1981462002@qq.com +/// 说明: 298 IntrinsicHeight 根据子元素的固有高度调整其子元素大小的组件,可解决很多布局的疑难杂症,但相对昂贵。 + +// { +// "widgetId": 298, +// "name": 'IntrinsicHeight基本使用', +// "priority": 1, +// "subtitle": "【child】 : 子组件 【Widget】\n" +// "如示例:左侧高可变动,中间高固定,右侧高取前两者的最高值。", +// } + +class IntrinsicHeightDemo extends StatefulWidget { + @override + _IntrinsicHeightDemoState createState() => _IntrinsicHeightDemoState(); +} + +class _IntrinsicHeightDemoState extends State { + var _height =120.0; + + @override + Widget build(BuildContext context) { + return Container( + child: Column( + children: [ + buildChild(_height), + SizedBox(height: 10), + _buildSlider() + ], + ), + ); + } + + Widget buildChild(double leftHeight) { + return IntrinsicHeight( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + height: leftHeight, + width: 120, + color: Colors.yellow, + alignment: Alignment.center, + child: Text("height:${leftHeight.toStringAsFixed(1)}"), + ), + Container( + color: Colors.blue, + width: 150, + height: 80, + alignment: Alignment.center, + child: Text("固定高"), + ), + Container( + color: Colors.red, + width: 60, + alignment: Alignment.center, + child: Text("最高"), + ) + ], + ), + ); + } + + Widget _buildSlider() =>Slider( + value: _height, + max: 200.0, + min: 30.0, + divisions: 17, + onChanged: (v)=> setState(() => _height= v), + ); +} diff --git a/lib/views/widgets/SingleChildRenderObjectWidget/IntrinsicWidth/node1_base.dart b/lib/views/widgets/SingleChildRenderObjectWidget/IntrinsicWidth/node1_base.dart new file mode 100644 index 0000000..e3c20aa --- /dev/null +++ b/lib/views/widgets/SingleChildRenderObjectWidget/IntrinsicWidth/node1_base.dart @@ -0,0 +1,75 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/21 +/// contact me by email 1981462002@qq.com +/// 说明: + +// { +// "widgetId": 297, +// "name": 'IntrinsicWidth基本使用', +// "priority": 1, +// "subtitle": +// "【child】 : 子组件 【Widget】\n" +// "如示例:上面宽可变动,中间宽固定,下面宽取前两者的最高值。", +// } + +class IntrinsicWidthDemo extends StatefulWidget { + @override + _IntrinsicWidthDemoState createState() => _IntrinsicWidthDemoState(); +} + +class _IntrinsicWidthDemoState extends State { + var _height =120.0; + + @override + Widget build(BuildContext context) { + return Container( + child: Column( + children: [ + buildChild(_height), + SizedBox(height: 10), + _buildSlider() + ], + ), + ); + } + + Widget buildChild(double leftWidth) { + return IntrinsicWidth( + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + height: 50, + width: leftWidth, + color: Colors.yellow, + alignment: Alignment.center, + child: Text("width:${leftWidth.toStringAsFixed(1)}"), + ), + Container( + color: Colors.blue, + width: 150, + height: 60, + alignment: Alignment.center, + child: Text("固定宽"), + ), + Container( + color: Colors.red, + height: 40, + alignment: Alignment.center, + child: Text("最宽"), + ) + ], + ), + ); + } + + Widget _buildSlider() =>Slider( + value: _height, + max: 200.0, + min: 80.0, + divisions: 17, + onChanged: (v)=> setState(() => _height= v), + ); +} diff --git a/lib/views/widgets/StatefulWidget/CupertinoTextField/node1_base.dart b/lib/views/widgets/StatefulWidget/CupertinoTextField/node1_base.dart new file mode 100644 index 0000000..c84de5f --- /dev/null +++ b/lib/views/widgets/StatefulWidget/CupertinoTextField/node1_base.dart @@ -0,0 +1,70 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/22 +/// contact me by email 1981462002@qq.com +/// 说明: 245 CupertinoTextField 1 Cupertino风格的输入框,属性和TextField类似,可指定控制器、文字样式、装饰线、行数限制、游标样式等。接收输入变化、完成输入等事件。 +// { +// "widgetId": 245, +// "name": "CupertinoTextField基础使用", +// "priority": 1, +// "subtitle": "【placeholder】 : 提示文字 【String】\n" +// "【showCursor】 : 是否显示游标 【bool】\n" +// "【minLines】 : 最小行数 【int】\n" +// "【maxLines】 : 最大行数 【int】\n" +// "【padding】 : 内边距 【EdgeInsetsGeometry】\n" +// "【onChanged】 : 变化监听 【ValueChanged】\n" +// "【onTap】: 点击监听 【GestureTapCallback】\n" +// "【onSubmitted】: 提交监听 【ValueChanged】", +// } +class CupertinoTextFieldDemo extends StatefulWidget { + @override + _CupertinoTextFieldDemoState createState() => _CupertinoTextFieldDemoState(); +} + +class _CupertinoTextFieldDemoState extends State { + var _value = ''; + var _color =Colors.black; + + @override + Widget build(BuildContext context) { + return Container( + child: Column( + children: [ + Text('输入了:$_value',style: TextStyle(color: _color),), + CupertinoTextField( + placeholder: 'Input Name', + showCursor: true, + minLines: 1, + maxLines: 4, + padding: EdgeInsets.all(8), + onChanged: _onChanged, + onTap: _onTap, + onSubmitted: _onSubmitted, + ), + ], + ), + ); + } + + void _onChanged(String value) { + setState(() { + _value = value; + }); + } + + void _onTap() { + print('----_onTap----'); + setState(() { + _color=Colors.blue; + }); + } + + void _onSubmitted(String value) { + print('----_onSubmitted:$value}----'); + setState(() { + _color=Colors.black; + }); + } + +} diff --git a/lib/views/widgets/StatefulWidget/CupertinoTextField/node2_style.dart b/lib/views/widgets/StatefulWidget/CupertinoTextField/node2_style.dart new file mode 100644 index 0000000..5e88485 --- /dev/null +++ b/lib/views/widgets/StatefulWidget/CupertinoTextField/node2_style.dart @@ -0,0 +1,41 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/22 +/// contact me by email 1981462002@qq.com +/// 说明: 245 CupertinoTextField 1 Cupertino风格的输入框,属性和TextField类似,可指定控制器、文字样式、装饰线、行数限制、游标样式等。接收输入变化、完成输入等事件。 +// { +// "widgetId": 245, +// "name": 'CupertinoTextField常用样式属性', +// "priority": 2, +// "subtitle": "【style】 : 输入文字样式 【TextStyle】\n" +// "【prefix】: 前缀组件 【Widget】\n" +// "【prefixMode】: 前缀模式 【OverlayVisibilityMode】\n" +// "【suffix】: 后缀组件 【Widget】\n" +// "【suffixMode】: 后缀模式 【OverlayVisibilityMode】\n" +// "【cursorColor】: 游标颜色 【Color】\n" +// "【cursorWidth】: 游标宽度 【double】\n" +// "【cursorRadius】: 游标圆角 【Radius】\n" +// "【readOnly】: 是否只读 【bool】", +// } +class CupertinoTextFieldStyle extends StatelessWidget { + + @override + Widget build(BuildContext context) { + return Container( + child: + CupertinoTextField( + style: TextStyle(color: Colors.blue), + prefix: Icon(CupertinoIcons.add), + prefixMode: OverlayVisibilityMode.notEditing, + suffix: Icon(CupertinoIcons.clear), + suffixMode: OverlayVisibilityMode.editing, + cursorColor: Colors.purple, + cursorWidth: 4, + cursorRadius: Radius.circular(2), + readOnly: false, + placeholder: '输入用户名', + ) + ); + } +} diff --git a/lib/views/widgets/StatefulWidget/Navigator/node1_base.dart b/lib/views/widgets/StatefulWidget/Navigator/node1_base.dart new file mode 100644 index 0000000..448e072 --- /dev/null +++ b/lib/views/widgets/StatefulWidget/Navigator/node1_base.dart @@ -0,0 +1,170 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/19 +/// contact me by email 1981462002@qq.com +/// 说明: +/// +// { +// "widgetId": 232, +// "name": 'Navigator基本用法', +// "priority": 1, +// "subtitle": +// "【initialRoute】 : 最初显示路由 【String】\n" +// "【onGenerateRoute】 : 路由生成器 【RouteFactory】\n" +// "【observers】 : 路由监听器 【List】\n" +// "【onPopPage】 : 出栈回调 【PopPageCallback】", +// } +class NavigatorDemo extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Container( + height: 200, + width: 300, + child: Navigator( + onPopPage: _onPopPage, + initialRoute: '/home-content', + onGenerateRoute: _onGenerateRoute, + observers: [TolyNavigatorObservers()], + ), + ); + } + + Route _onGenerateRoute(RouteSettings settings) { + switch (settings.name) { + case '/home-content': + return MaterialPageRoute( + builder: (_) => HomeContent(), settings: settings); + case "/red": + return MaterialPageRoute(builder: (_) => RedPage(), settings: settings); + case "/yellow": + return MaterialPageRoute( + builder: (_) => YellowPage(), settings: settings); + case "/green": + return MaterialPageRoute( + builder: (_) => GreenPage(), settings: settings); + default: + return MaterialPageRoute( + builder: (_) => HomeContent(), settings: settings); + } + } + + bool _onPopPage(Route route, result) { + print('----_onPopPage-----'); + return true; + } +} + +//路由监听器 +class TolyNavigatorObservers extends NavigatorObserver { + @override + void didPush(Route route, Route previousRoute) { + print( + '--didPush:--route:--${route.settings}--previousRoute:--${previousRoute?.settings}'); + } + + @override + void didStopUserGesture() { + print('--didStopUserGesture:--'); + } + + @override + void didStartUserGesture(Route route, Route previousRoute) { + print( + '--didStartUserGesture:--route:--${route.settings}--previousRoute:--${previousRoute.settings}'); + } + + @override + void didReplace({Route newRoute, Route oldRoute}) { + print( + '--didReplace:--newRoute:--${newRoute.settings}--oldRoute:--${oldRoute.settings}'); + } + + @override + void didRemove(Route route, Route previousRoute) { + print( + '--didRemove:--route:--${route.settings}--previousRoute:--${previousRoute.settings}'); + } + + @override + void didPop(Route route, Route previousRoute) { + print( + '--didPop:--route:--${route.settings}--previousRoute:--${previousRoute.settings}'); + } +} + +class HomeContent extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Container( + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + RaisedButton( + color: Colors.red, + onPressed: () { + Navigator.pushNamed(context, '/red'); + }, + ), + RaisedButton( + color: Colors.yellow, + onPressed: () { + Navigator.pushNamed(context, '/yellow'); + }, + ), + RaisedButton( + color: Colors.green, + onPressed: () { + Navigator.pushNamed(context, '/green'); + }, + ) + ], + ), + ], + ), + ); + } +} + +class RedPage extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text("RedPage"), + ), + body: Container( + color: Colors.red, + ), + ); + } +} + +class YellowPage extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text("YellowPage"), + ), + body: Container( + color: Colors.yellow, + ), + ); + } +} + +class GreenPage extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text("GreenPage"), + ), + body: Container( + color: Colors.green, + ), + ); + } +} diff --git a/lib/views/widgets/StatefulWidget/ValueListenableBuilder/node1_base.dart b/lib/views/widgets/StatefulWidget/ValueListenableBuilder/node1_base.dart new file mode 100644 index 0000000..b60bade --- /dev/null +++ b/lib/views/widgets/StatefulWidget/ValueListenableBuilder/node1_base.dart @@ -0,0 +1,56 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/21 +/// contact me by email 1981462002@qq.com +/// 说明: 255 ValueListenableBuilder 1 可以监听一个值,当其变化时通过builder回调能重建界面,避免使用setState刷新。 +// { +// "widgetId": 255, +// "name": 'ValueListenableBuilder基本使用', +// "priority": 1, +// "subtitle": "【builder】: 组件构造器 【ValueWidgetBuilder】\n" +// "【valueListenable】: 监听值 【ValueListenable】\n" +// "【child】: 子组件 【Widget】", +// } + +class ValueListenableBuilderDemo extends StatelessWidget { + ValueListenableBuilderDemo({Key key}) : super(key: key); + + final ValueNotifier _counter = ValueNotifier(0); + + @override + Widget build(BuildContext context) { + return Container( + height: 200, + child: Scaffold( + appBar: AppBar(title: Text("ValueListenableBuilder")), + body: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text('You have pushed the button this many times:'), + ValueListenableBuilder( + builder: _buildWithValue, + valueListenable: _counter, + child: const Text('I am Child!'), + ) + ], + ), + ), + floatingActionButton: FloatingActionButton( + child: Icon(Icons.plus_one), + onPressed: () => _counter.value += 1, + ), + ), + ); + } + + Widget _buildWithValue(BuildContext context, int value, Widget child) { + return Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Text('$value'), + child, + ], + ); + } +} diff --git a/lib/views/widgets/StatelessWidget/MaterialBanner/node1_one_btn.dart b/lib/views/widgets/StatelessWidget/MaterialBanner/node1_one_btn.dart new file mode 100644 index 0000000..5db4583 --- /dev/null +++ b/lib/views/widgets/StatelessWidget/MaterialBanner/node1_one_btn.dart @@ -0,0 +1,47 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/21 +/// contact me by email 1981462002@qq.com +/// 说明: 211 MaterialBanner Material风格的横幅组件,支持左中右或左中下结构,可指定边距背景色等。 + +// { +// "widgetId": 211, +// "name": 'MaterialBanner一行的使用', +// "priority": 1, +// "subtitle": "【content】 : 中间组件 【Widget】\n" +// "【leading】: 左侧组件 【Widget】\n" +// "【actions】: 右侧组件列表 【List】\n" +// "【padding】: 内边距 【EdgeInsetsGeometry】\n" +// "【forceActionsBelow】: 是否按钮在下方 【bool】\n" +// "【backgroundColor】: 背景色 【Color】", +// } +class MaterialBannerDemo extends StatelessWidget { + final info = + 'Welcome to Flutter Unit!'; + + @override + Widget build(BuildContext context) { + return Column( + children: [MaterialBanner( + content: Text( + info, + style: TextStyle(color: Colors.white), + ), + backgroundColor: Colors.purple, + leading: Icon(Icons.info, color: Colors.lightBlueAccent), + padding: EdgeInsetsDirectional.only(start: 16.0, top: 2.0), + forceActionsBelow: false, // 默认false + actions: [ + Text( + 'I KNOW', + style:TextStyle( + color: Colors.orange, + fontWeight: FontWeight.bold, + fontSize: 14) , + ) + ], + )], + ); + } + +} diff --git a/lib/views/widgets/StatelessWidget/MaterialBanner/node2_two_btn.dart b/lib/views/widgets/StatelessWidget/MaterialBanner/node2_two_btn.dart new file mode 100644 index 0000000..46e976c --- /dev/null +++ b/lib/views/widgets/StatelessWidget/MaterialBanner/node2_two_btn.dart @@ -0,0 +1,60 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/21 +/// contact me by email 1981462002@qq.com +/// 说明: +// { +// "widgetId": 211, +// "name": 'MaterialBanner两行的使用', +// "priority": 2, +// "subtitle": "【contentTextStyle】: 中间位置样式 【TextStyle】\n" +// "【leadingPadding】: 左侧组件边距 【EdgeInsetsGeometry】\n" +// "当尾部组件数量大于1,该组件结构为左中下。", +// } +class MaterialBannerDemoTwo extends StatelessWidget { + final info = + 'A banner displays an important, succinct message, and provides actions for users to address. ' + 'A user action is required for itto be dismissed.'; + + @override + Widget build(BuildContext context) { + return Column( + children: [MaterialBanner( + content: Text( + info, + style: TextStyle(color: Colors.white), + ), + backgroundColor: Colors.purple, + leading: Icon(Icons.warning, color: Colors.yellow), + padding: EdgeInsetsDirectional.only(start: 16.0, top: 2.0,end: 2), + leadingPadding:EdgeInsetsDirectional.only(end: 16.0) , + actions: [ + RaisedButton( + color: Colors.white, + onPressed: () {}, + child: Text( + 'I KNOW', + style: TextStyle( + color: Colors.purple, + fontWeight: FontWeight.bold, + fontSize: 14), + ), + ), + + RaisedButton( + color: Colors.white, + onPressed: () {}, + child: Text( + 'I IGNORE', + style: TextStyle( + color: Colors.purple, + fontWeight: FontWeight.bold, + fontSize: 14), + ), + ), + ], + )], + ); + } + +} diff --git a/lib/views/widgets/StatelessWidget/NavigationToolbar/node1_base.dart b/lib/views/widgets/StatelessWidget/NavigationToolbar/node1_base.dart new file mode 100644 index 0000000..669157e --- /dev/null +++ b/lib/views/widgets/StatelessWidget/NavigationToolbar/node1_base.dart @@ -0,0 +1,45 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/20 +/// contact me by email 1981462002@qq.com +/// 说明: NavigationToolbar 214 左中右模式的通用结构组件,可指定中间组件距左侧边距及是否居中。源码在AppBar等导航条结构中有使用它。 +// { +// "widgetId": 214, +// "name": 'NavigationToolbar基本使用', +// "priority": 1, +// "subtitle": "【leading】 : 左侧组件 【Widget】\n" +// "【middle】: 中间组件 【Widget】\n" +// "【trailing】: 右侧组件组件 【Widget】\n" +// "【centerMiddle】: 中间组件是否居中 【bool】\n" +// "【middleSpacing】: 中间组件距左距离 【double】", +// } +class NavigationToolbarDemo extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + height: 60, + child: NavigationToolbar( + leading: Icon(Icons.ac_unit), + middle: Text('middleSpacing#true'), + middleSpacing: 20, + centerMiddle: true, + trailing: Icon(Icons.more_vert), + ), + ), + Container( + height: 60, + child: NavigationToolbar( + leading: Icon(Icons.ac_unit), + middle: Text('middleSpacing#false'), + middleSpacing: 20, + centerMiddle: false, + trailing: Icon(Icons.more_vert), + ), + ), + ], + ); + } +} \ No newline at end of file diff --git a/lib/views/widgets/StatelessWidget/OrientationBuilder/node1_base.dart b/lib/views/widgets/StatelessWidget/OrientationBuilder/node1_base.dart new file mode 100644 index 0000000..dacb663 --- /dev/null +++ b/lib/views/widgets/StatelessWidget/OrientationBuilder/node1_base.dart @@ -0,0 +1,57 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/21 +/// contact me by email 1981462002@qq.com +/// 说明: 203 OrientationBuilder 能够回调父组件是横向还是纵向,可以据此来构建不同的子组件。 +// { +// "widgetId": 203, +// "name": 'OrientationBuilder基本使用', +// "priority": 1, +// "subtitle": "【builder】 : 方向组件构造器 【OrientationWidgetBuilder】", +// } +class OrientationBuilderDemo extends StatefulWidget { + @override + _OrientationBuilderDemoState createState() => _OrientationBuilderDemoState(); +} + +class _OrientationBuilderDemoState extends State { + double _width = 200; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Container( + width: _width, + height: 200, + child: OrientationBuilder(builder: _builder), + color: Colors.orange, + ), + _buildSlider() + ], + ); + } + + //根据回调的orientation返回组件 + Widget _builder(BuildContext context, Orientation orientation) { + switch(orientation){ + case Orientation.portrait: + return Icon(Icons.phone_android,size: 60,); + break; + case Orientation.landscape: + return RotatedBox( + quarterTurns: 1, + child: Icon(Icons.phone_android,size: 60,)); + break; + default: return Container(); + } + } + + Widget _buildSlider() =>Slider( + value: _width, + max: 350.0, + min: 80.0, + divisions: 17, + onChanged: (v)=> setState(() => _width= v), + ); +} diff --git a/lib/views/widgets/StatelessWidget/Title/node1_base.dart b/lib/views/widgets/StatelessWidget/Title/node1_base.dart new file mode 100644 index 0000000..63d00e2 --- /dev/null +++ b/lib/views/widgets/StatelessWidget/Title/node1_base.dart @@ -0,0 +1,24 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/7/22 +/// contact me by email 1981462002@qq.com +/// 说明: 208 Title 0 该组件用于描述app在操作系统中的名称,可以在应用栏列表里看到效果。MaterialApp中的title字段效果的根源是该组件。 +// { +// "widgetId": 208, +// "name": "Title基本使用", +// "priority": 1, +// "subtitle": "【title】 : 名称 【int】\n" +// "【color】: 颜色 【Color】\n" +// "【child】: 子组件 【Widget】", +// } +class TitleDemo extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Container( + child: Title( + title: '张风捷特烈', + color: Color(0xFF9C27B0), + child: Center(child: Text('应用菜单栏中该页的名称为: 张风捷特烈'))), + ); + } +} diff --git a/lib/views/widgets/exp/proxy_unit.dart b/lib/views/widgets/exp/proxy_unit.dart index 4eb0ab3..5f5a708 100644 --- a/lib/views/widgets/exp/proxy_unit.dart +++ b/lib/views/widgets/exp/proxy_unit.dart @@ -17,4 +17,9 @@ export '../ProxyWidget/IconTheme/node1_base.dart'; export '../ProxyWidget/ScrollConfiguration/node1_base.dart'; export '../ProxyWidget/Expanded/node1_base.dart'; export '../ProxyWidget/Positioned/node1_base.dart'; -export '../ProxyWidget/LayoutId/node1_base.dart'; \ No newline at end of file +export '../ProxyWidget/LayoutId/node1_base.dart'; +export '../ProxyWidget/ChipTheme/node1_base.dart' hide CustomFilterChip; +export '../ProxyWidget/ListTileTheme/node1_base.dart'; +export '../ProxyWidget/MaterialBannerTheme/node1_base.dart'; +export '../ProxyWidget/PopupMenuTheme/node1_base.dart'; +export '../ProxyWidget/ToggleButtonsTheme/node1_base.dart'; \ No newline at end of file diff --git a/lib/views/widgets/exp/render_object_unit.dart b/lib/views/widgets/exp/render_object_unit.dart index 696e797..272089f 100644 --- a/lib/views/widgets/exp/render_object_unit.dart +++ b/lib/views/widgets/exp/render_object_unit.dart @@ -76,4 +76,6 @@ export '../SingleChildRenderObjectWidget/LayoutBuilder/node1_base.dart'; export '../SingleChildRenderObjectWidget/LayoutBuilder/node2_fit.dart'; export '../SingleChildRenderObjectWidget/LayoutBuilder/node3_expend.dart'; export '../SingleChildRenderObjectWidget/ShaderMask/node1_radial.dart'; -export '../SingleChildRenderObjectWidget/ShaderMask/node2_linear.dart'; \ No newline at end of file +export '../SingleChildRenderObjectWidget/ShaderMask/node2_linear.dart'; +export '../SingleChildRenderObjectWidget/IntrinsicHeight/node1_base.dart'; +export '../SingleChildRenderObjectWidget/IntrinsicWidth/node1_base.dart'; \ No newline at end of file diff --git a/lib/views/widgets/exp/stateful_unit.dart b/lib/views/widgets/exp/stateful_unit.dart index b257089..4226bc7 100644 --- a/lib/views/widgets/exp/stateful_unit.dart +++ b/lib/views/widgets/exp/stateful_unit.dart @@ -30,6 +30,7 @@ export '../StatefulWidget/CupertinoSlider/node1_base.dart'; export '../StatefulWidget/CupertinoSwitch/node1_base.dart'; export '../StatefulWidget/CupertinoSegmentedControl/node1_base.dart'; export '../StatefulWidget/CupertinoSegmentedControl/node2_color.dart'; +export '../StatefulWidget/Navigator/node1_base.dart'; export '../StatefulWidget/Image/node1_base.dart'; export '../StatefulWidget/Image/node2_fit.dart'; @@ -49,6 +50,9 @@ export '../StatefulWidget/SelectableText/node1_base.dart'; export '../StatefulWidget/SelectableText/node2_align.dart'; export '../StatefulWidget/CupertinoNavigationBar/node1_base.dart'; export '../StatefulWidget/CupertinoTabBar/node1_base.dart'; +export '../StatefulWidget/CupertinoTextField/node1_base.dart'; +export '../StatefulWidget/CupertinoTextField/node2_style.dart'; +export '../StatefulWidget/ValueListenableBuilder/node1_base.dart'; export '../StatefulWidget/DropdownButton/node1_base.dart'; export '../StatefulWidget/DropdownButton/node2_style.dart'; diff --git a/lib/views/widgets/exp/stateless_unit.dart b/lib/views/widgets/exp/stateless_unit.dart index 41d104d..0c8c760 100644 --- a/lib/views/widgets/exp/stateless_unit.dart +++ b/lib/views/widgets/exp/stateless_unit.dart @@ -10,6 +10,7 @@ export '../StatelessWidget/Card/node2_shape.dart'; export '../StatelessWidget/PreferredSize/node1_base.dart'; export '../StatelessWidget/PreferredSize/node2_adapter.dart'; export '../StatelessWidget/Builder/node1_base.dart'; +export '../StatelessWidget/NavigationToolbar/node1_base.dart'; export '../StatelessWidget/CheckboxListTile/node1_base.dart'; export '../StatelessWidget/CheckboxListTile/node2_select.dart'; @@ -25,9 +26,13 @@ export '../StatelessWidget/Container/node3_alignment.dart'; export '../StatelessWidget/Container/node4_decoration.dart'; export '../StatelessWidget/Container/node5_transform.dart'; export '../StatelessWidget/Container/node6_constraints.dart'; +export '../StatelessWidget/MaterialBanner/node1_one_btn.dart'; +export '../StatelessWidget/MaterialBanner/node2_two_btn.dart'; export '../StatelessWidget/DataTable/node1_base.dart'; export '../StatelessWidget/DataTable/node2_operation.dart'; +export '../StatelessWidget/OrientationBuilder/node1_base.dart'; +export '../StatelessWidget/Title/node1_base.dart'; export '../StatelessWidget/CupertinoTheme/node1_base.dart'; export '../StatelessWidget/CupertinoTheme/node2_use.dart'; diff --git a/lib/views/widgets/widgets_map.dart b/lib/views/widgets/widgets_map.dart index 5d7059a..e95be81 100644 --- a/lib/views/widgets/widgets_map.dart +++ b/lib/views/widgets/widgets_map.dart @@ -51,6 +51,33 @@ class WidgetsMap { return [ CustomBanner(), ]; + + case "Title": + return [ + TitleDemo(), + ]; + case "ToggleButtonsTheme": + return [ + ToggleButtonsThemeDemo(), + ]; + case "NavigationToolbar": + return [ + NavigationToolbarDemo(), + ]; + case "CupertinoTextField": + return [ + CupertinoTextFieldDemo(), + CupertinoTextFieldStyle(), + ]; + case "MaterialBanner": + return [ + MaterialBannerDemo(), + MaterialBannerDemoTwo(), + ]; + case "OrientationBuilder": + return [ + OrientationBuilderDemo(), + ]; case "Icon": return [ CustomIcon(), @@ -81,12 +108,26 @@ class WidgetsMap { ]; case "ChoiceChip": return [CustomChoiceChip()]; + case "ListTileTheme": + return [ListTileThemeDemo()]; + case "ValueListenableBuilder": + return [ValueListenableBuilderDemo()]; case "ActionChip": return [CustomActionChip()]; + case "MaterialBannerTheme": + return [MaterialBannerThemeDemo()]; + case "PopupMenuTheme": + return [PopupMenuThemeDemo()]; case "InputChip": return [PressInputChip(), SelectInputChip()]; case "FilterChip": return [CustomFilterChip()]; + case "IntrinsicHeight": + return [IntrinsicHeightDemo()]; + case "IntrinsicWidth": + return [IntrinsicWidthDemo()]; + case "ChipTheme": + return [ChipThemeDemo()]; case "ListTile": return [CustomListTile(), SelectListTile(), DenseListTile()]; case "CheckboxListTile": @@ -949,6 +990,10 @@ class WidgetsMap { return [ DividerThemeDemo(), ]; + case "Navigator": + return [ + NavigatorDemo(), + ]; case "SliderTheme": return [ SliderThemeDemo(), diff --git a/macos/Runner/DebugProfile.entitlements b/macos/Runner/DebugProfile.entitlements index dddb8a3..d59aa68 100644 --- a/macos/Runner/DebugProfile.entitlements +++ b/macos/Runner/DebugProfile.entitlements @@ -4,9 +4,17 @@ com.apple.security.app-sandbox + com.apple.security.cs.allow-jit + com.apple.security.network.server + + com.apple.security.network.client + + + com.apple.security.files.downloads.read-write +