From 31ecdac0baecb6c9fa5ca17a2e071ff724879424 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Wed, 22 Jul 2020 15:50:04 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20=E6=9B=B4=E6=96=B0flutter=20unit?= =?UTF-8?q?=20mac=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/flutter.db | Bin 700416 -> 745472 bytes lib/blocs/detail/detail_bloc.dart | 13 +- lib/blocs/detail/detail_state.dart | 1 + .../pages/detail/widget_detail_page.dart | 2 - .../ProxyWidget/ChipTheme/node1_base.dart | 76 ++++++++ .../ProxyWidget/ListTileTheme/node1_base.dart | 51 ++++++ .../MaterialBannerTheme/node1_base.dart | 67 +++++++ .../PopupMenuTheme/node1_base.dart | 71 ++++++++ .../ToggleButtonsTheme/node1_base.dart | 55 ++++++ .../IntrinsicHeight/node1_base.dart | 74 ++++++++ .../IntrinsicWidth/node1_base.dart | 75 ++++++++ .../CupertinoTextField/node1_base.dart | 70 ++++++++ .../CupertinoTextField/node2_style.dart | 41 +++++ .../StatefulWidget/Navigator/node1_base.dart | 170 ++++++++++++++++++ .../ValueListenableBuilder/node1_base.dart | 56 ++++++ .../MaterialBanner/node1_one_btn.dart | 47 +++++ .../MaterialBanner/node2_two_btn.dart | 60 +++++++ .../NavigationToolbar/node1_base.dart | 45 +++++ .../OrientationBuilder/node1_base.dart | 57 ++++++ .../StatelessWidget/Title/node1_base.dart | 24 +++ lib/views/widgets/exp/proxy_unit.dart | 7 +- lib/views/widgets/exp/render_object_unit.dart | 4 +- lib/views/widgets/exp/stateful_unit.dart | 4 + lib/views/widgets/exp/stateless_unit.dart | 5 + lib/views/widgets/widgets_map.dart | 45 +++++ macos/Runner/DebugProfile.entitlements | 8 + 26 files changed, 1120 insertions(+), 8 deletions(-) create mode 100644 lib/views/widgets/ProxyWidget/ChipTheme/node1_base.dart create mode 100644 lib/views/widgets/ProxyWidget/ListTileTheme/node1_base.dart create mode 100644 lib/views/widgets/ProxyWidget/MaterialBannerTheme/node1_base.dart create mode 100644 lib/views/widgets/ProxyWidget/PopupMenuTheme/node1_base.dart create mode 100644 lib/views/widgets/ProxyWidget/ToggleButtonsTheme/node1_base.dart create mode 100644 lib/views/widgets/SingleChildRenderObjectWidget/IntrinsicHeight/node1_base.dart create mode 100644 lib/views/widgets/SingleChildRenderObjectWidget/IntrinsicWidth/node1_base.dart create mode 100644 lib/views/widgets/StatefulWidget/CupertinoTextField/node1_base.dart create mode 100644 lib/views/widgets/StatefulWidget/CupertinoTextField/node2_style.dart create mode 100644 lib/views/widgets/StatefulWidget/Navigator/node1_base.dart create mode 100644 lib/views/widgets/StatefulWidget/ValueListenableBuilder/node1_base.dart create mode 100644 lib/views/widgets/StatelessWidget/MaterialBanner/node1_one_btn.dart create mode 100644 lib/views/widgets/StatelessWidget/MaterialBanner/node2_two_btn.dart create mode 100644 lib/views/widgets/StatelessWidget/NavigationToolbar/node1_base.dart create mode 100644 lib/views/widgets/StatelessWidget/OrientationBuilder/node1_base.dart create mode 100644 lib/views/widgets/StatelessWidget/Title/node1_base.dart diff --git a/assets/flutter.db b/assets/flutter.db index 4b635205f3e30a393a2bbadd0bc25e6b05b0844a..f331e6ef31fee32f8aed3e8d3c3839ddd109fcbb 100644 GIT binary patch delta 22525 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 Pi*aNxw!k^&#wF*pU?M|IcH|hIdkVX6RMB) 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 TFxk8l&*XjW;jk;;?92WaOr*sO 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 +