From c0ff2b548cfa15b1a6c58568b7c68cf07e64f646 Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sun, 3 May 2020 14:19:11 +0800 Subject: [PATCH] =?UTF-8?q?:zap:=20=E4=BC=98=E5=8C=96=E8=AF=A6=E6=83=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 +- assets/flutter.db | Bin 651264 -> 684032 bytes assets/images/widgets/CircleAvatar.png | Bin 54496 -> 0 bytes assets/images/widgets/FadeInImage.png | Bin 47779 -> 0 bytes .../permanent/code/back/code_panel.dart | 66 - lib/components/project/widget_node_panel.dart | 4 +- lib/storage/dao/node_dao.dart | 2 +- lib/views/app/splash/unit_splash.dart | 43 +- .../Column/node1_base.dart | 3 +- .../Flex/node1_direction.dart | 2 +- .../RichText/node1_base.dart | 2 +- .../RichText/node2_widget.dart | 1 - .../Row/node1_base.dart | 1 - lib/views/widgets/Other/Table/node1_base.dart | 4 +- .../DefaultTextStyle/node1_base.dart | 2 +- .../ProxyWidget/Expanded/node1_base.dart | 4 +- .../ProxyWidget/Flexible/node1_base.dart | 1 - .../ProxyWidget/Positioned/node1_base.dart | 2 +- .../AbsorbPointer/node1_base.dart | 5 +- .../Align/node1_base.dart | 1 - .../AnimatedSize/node1_base.dart | 2 +- .../AspectRatio/node1_base.dart | 3 + .../ColorFiltered/node1_base.dart | 4 +- .../DecoratedBox/node1_base.dart | 41 +- .../DecoratedBox/node2_image.dart | 36 + .../DecoratedBox/node3_border.dart | 32 + .../DecoratedBox/node4_shape.dart | 43 + .../DecoratedBox/node5_line.dart | 26 + .../DecoratedBox/node6_flutterLogo.dart | 27 + .../FittedBox/node1_base.dart | 14 +- .../FractionallySizedBox/node1_base.dart | 2 +- .../IgnorePointer/node1_base.dart | 3 +- .../Opacity/node1_base.dart | 4 +- .../Padding/node1_all.dart | 40 + .../Padding/node2_only.dart | 38 + .../Padding/node3_symmetric.dart | 38 + .../Transform/node1_skew.dart | 1 - .../Transform/node5_perspective.dart | 2 +- .../Sliver/CustomScrollView/node1_base.dart | 1 - .../Sliver/FlexibleSpaceBar/node1_base.dart | 3 +- .../Sliver/SliverAppBar/node1_base.dart | 3 +- .../Sliver/SliverFillViewport/node1_base.dart | 4 +- .../widgets/Sliver/SliverGrid/node1_base.dart | 1 - .../widgets/Sliver/SliverList/node1_base.dart | 1 - .../AlignTransition/node1_base.dart | 6 +- .../BottomAppBar/node1_base.dart | 4 +- .../StatefulWidget/Checkbox/node1_base.dart | 2 +- .../node1_base.dart | 2 +- .../CupertinoButton/node1_base.dart | 3 +- .../node1_base.dart | 5 +- .../CupertinoTabBar/node1_base.dart | 3 +- .../node1_base.dart | 2 +- .../StatefulWidget/Draggable/node3_use.dart | 2 +- .../DropdownButton/node1_base.dart | 2 +- .../ExpansionTile/node1_base.dart | 6 +- .../StatefulWidget/Hero/node1_base.dart | 2 +- .../StatefulWidget/Image/node2_fit.dart | 2 +- .../StatefulWidget/Image/node3_alignment.dart | 2 +- .../Image/node4_colorBlendMode.dart | 2 +- .../StatefulWidget/Image/node5_repeat.dart | 2 +- .../Image/node6_centerSlice.dart | 2 +- .../StatefulWidget/Ink/node2_image.dart | 2 +- .../LinearProgressIndicator/node1_base.dart | 3 + .../MaterialApp/node1_base.dart | 6 +- .../PopupMenuButton/node1_base.dart | 2 +- .../PopupMenuDivider/node1_base.dart | 2 +- .../PositionedTransition/node1_base.dart | 2 +- .../RangeSlider/node1_base.dart | 2 +- .../StatefulWidget/RawChip/node1_press.dart | 3 +- .../StatefulWidget/RawChip/node2_select.dart | 3 +- .../RawMaterialButton/node1_base.dart | 2 +- .../RawMaterialButton/node2_shape.dart | 1 - .../RefreshIndicator/node1_base.dart | 3 + .../node1_base.dart | 3 + .../RotationTransition/node1_base.dart | 4 + .../StatefulWidget/Scaffold/node1_base.dart | 6 +- .../ScaleTransition/node1_base.dart | 4 +- .../SelectableText/node1_base.dart | 2 +- .../SizeTransition/node1_base.dart | 2 +- .../SlideTransition/node1_base.dart | 4 +- .../StatefulWidget/Switch/node1_base.dart | 2 +- .../StatefulWidget/Switch/node2_image.dart | 2 +- .../StatefulWidget/TabBarView/node1_base.dart | 2 +- .../StatefulWidget/TextField/node1_base.dart | 4 +- .../StatefulWidget/Tooltip/node1_base.dart | 2 +- .../Tooltip/node2_decoration.dart | 2 +- .../ActionChip/node1_base.dart | 2 +- .../StatelessWidget/Banner/node1_base.dart | 4 +- .../StatelessWidget/ButtonBar/node1_base.dart | 26 +- .../ButtonBar/node2_padding.dart | 38 + .../StatelessWidget/Card/node2_shape.dart | 2 +- .../StatelessWidget/Chip/node3_delete.dart | 2 +- .../node1_base.dart | 4 +- .../{node1_base.dart => no_node1_base.dart} | 0 .../FloatingActionButton/node3_shape.dart | 2 +- .../StatelessWidget/Icon/node2_diy.dart | 2 +- .../StatelessWidget/InputChip/node1_base.dart | 3 +- .../InputChip/node2_select.dart | 3 +- .../StatelessWidget/ListTile/node1_base.dart | 3 +- .../MaterialButton/node1_base.dart | 3 +- .../MaterialButton/node2_onLongPress.dart | 5 +- .../MaterialButton/node3_shape.dart | 9 +- .../PreferredSize/node1_base.dart | 27 + .../PreferredSize/node2_adapter.dart | 34 + .../SimpleDialogOption/node1_base.dart | 6 +- .../TabBar/no_shadow_tab_bar.dart | 1345 +++++++++++++++++ .../TabBar/node2_noShadow.dart | 3 +- lib/views/widgets/exp/render_object_unit.dart | 9 +- lib/views/widgets/exp/stateless_unit.dart | 3 + lib/views/widgets/widgets_map.dart | 16 +- 110 files changed, 1905 insertions(+), 285 deletions(-) delete mode 100644 assets/images/widgets/CircleAvatar.png delete mode 100644 assets/images/widgets/FadeInImage.png delete mode 100755 lib/components/permanent/code/back/code_panel.dart create mode 100644 lib/views/widgets/SingleChildRenderObjectWidget/DecoratedBox/node2_image.dart create mode 100644 lib/views/widgets/SingleChildRenderObjectWidget/DecoratedBox/node3_border.dart create mode 100644 lib/views/widgets/SingleChildRenderObjectWidget/DecoratedBox/node4_shape.dart create mode 100644 lib/views/widgets/SingleChildRenderObjectWidget/DecoratedBox/node5_line.dart create mode 100644 lib/views/widgets/SingleChildRenderObjectWidget/DecoratedBox/node6_flutterLogo.dart create mode 100644 lib/views/widgets/SingleChildRenderObjectWidget/Padding/node1_all.dart create mode 100644 lib/views/widgets/SingleChildRenderObjectWidget/Padding/node2_only.dart create mode 100644 lib/views/widgets/SingleChildRenderObjectWidget/Padding/node3_symmetric.dart create mode 100644 lib/views/widgets/StatelessWidget/ButtonBar/node2_padding.dart rename lib/views/widgets/StatelessWidget/CupertinoDialogAction/{node1_base.dart => no_node1_base.dart} (100%) create mode 100644 lib/views/widgets/StatelessWidget/PreferredSize/node1_base.dart create mode 100644 lib/views/widgets/StatelessWidget/PreferredSize/node2_adapter.dart create mode 100644 lib/views/widgets/StatelessWidget/TabBar/no_shadow_tab_bar.dart diff --git a/README.md b/README.md index 255123c..8429a7f 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,10 @@ [![GitHub stars](https://img.shields.io/github/stars/toly1994328/FlutterUnit)](https://github.com/toly1994328/FlutterUnit/stargazers) [![GitHub forks](https://img.shields.io/github/forks/toly1994328/FlutterUnit)](https://github.com/toly1994328/FlutterUnit/network) [![GitHub license](https://img.shields.io/github/license/toly1994328/FlutterUnit)](https://github.com/toly1994328/FlutterUnit/blob/master/LICENSE) + ### FlutterUnit apk 下载体验: - -![](https://user-gold-cdn.xitu.io/2020/4/24/171a9911d22d34a8?w=300&h=390&f=png&s=22765) +![](https://toly1994328.gitee.io/photo/ewm/flutter_unit_ewm.png) > 当前Flutter 版本 @@ -18,6 +18,10 @@ Engine • revision e1e6ced81d Tools • Dart 2.7.0 ``` +#### Flutter Unit 周边 + +- 🔥 [Flutter Unit 更新记录 ](http://blog.toly1994.com/FlutterUnit_update.html) + --- diff --git a/assets/flutter.db b/assets/flutter.db index b9bb5c7876915606b540a1578a02f461f375b88f..87d48261caf9bc2fbeb3a081c02ad4f44e05139d 100644 GIT binary patch delta 49703 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 ZfH?c*0tm%tomPr&l=Vb)NSs4-{vSmPIcWd@ delta 28419 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 JxIc2Cl4 diff --git a/assets/images/widgets/CircleAvatar.png b/assets/images/widgets/CircleAvatar.png deleted file mode 100644 index 45c3e43d9638b920eda8115947608de347cd55c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54496 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 diff --git a/assets/images/widgets/FadeInImage.png b/assets/images/widgets/FadeInImage.png deleted file mode 100644 index c11b3d3a9c2788af1c6e110e806f7408be4b4004..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47779 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[snapshot.data], - ), - ); - // computing - return SizedBox.shrink(); - }, - ); - - return SingleChildScrollView( - child: Container( - child: DefaultTextStyle( - child: _codeWidget, - style: TextStyle(fontSize: fontSize, fontFamily: fontFamily), - ), - padding: EdgeInsets.all(10), - decoration: BoxDecoration( - color: style.backgroundColor ?? Color(0xffF6F8FA), - borderRadius: BorderRadius.all(Radius.circular(5.0))), - ), - ); - } -} - -class _HightlightArgs { - final HighlighterStyle style; - final String code; - _HightlightArgs(this.style, this.code); -} - -TextSpan _hightlight(_HightlightArgs args) => - DartHighlighter(args.style).format(args.code); diff --git a/lib/components/project/widget_node_panel.dart b/lib/components/project/widget_node_panel.dart index 36662d9..e27af74 100644 --- a/lib/components/project/widget_node_panel.dart +++ b/lib/components/project/widget_node_panel.dart @@ -130,12 +130,12 @@ class _WidgetNodePanelState extends State { width: MediaQuery.of(context).size.width, child: CodeWidget( fontFamily: widget.codeFamily, - code: widget.code, + code: isFirst?'':widget.code, style: widget.codeStyle ?? HighlighterStyle.fromColors(HighlighterStyle.lightColor), ), ), - duration: Duration(milliseconds: 500), + duration: Duration(milliseconds: 200), crossFadeState: _crossFadeState, ); diff --git a/lib/storage/dao/node_dao.dart b/lib/storage/dao/node_dao.dart index 33b22e4..c8e3990 100644 --- a/lib/storage/dao/node_dao.dart +++ b/lib/storage/dao/node_dao.dart @@ -37,7 +37,7 @@ class NodeDao { return await db.rawQuery( "SELECT name,subtitle,code " "FROM node " - "WHERE widgetId = ?", + "WHERE widgetId = ? ORDER BY priority", [id]); } } diff --git a/lib/views/app/splash/unit_splash.dart b/lib/views/app/splash/unit_splash.dart index 914061b..0a07449 100644 --- a/lib/views/app/splash/unit_splash.dart +++ b/lib/views/app/splash/unit_splash.dart @@ -22,7 +22,6 @@ class UnitSplash extends StatefulWidget { class _UnitSplashState extends State with TickerProviderStateMixin { AnimationController _controller; - AnimationController _secondController; double _factor; Animation _curveAnim; @@ -42,17 +41,12 @@ class _UnitSplashState extends State with TickerProviderStateMixin { if (s == AnimationStatus.completed) { setState(() { _animEnd = true; - _secondController.forward(); + Future.delayed(Duration(milliseconds: 600)).then((e){ + Navigator.of(context).pushReplacementNamed(Router.nav); + }); }); } }); - _secondController = - AnimationController(duration: Duration(milliseconds: 600), vsync: this) - ..addStatusListener((s) { - if (s == AnimationStatus.completed) { - Navigator.of(context).pushReplacementNamed(Router.nav); - } - }); _curveAnim = CurvedAnimation(parent: _controller, curve: Curves.fastOutSlowIn); _controller.forward(); @@ -98,36 +92,19 @@ class _UnitSplashState extends State with TickerProviderStateMixin { ); return Positioned( - top: winH / 1.55, - child: Container( - height: 150, - width: winW, - child: AlignTransition( - alignment: - AlignmentTween(begin: Alignment(-1, 0), end: Alignment.center) - .animate(_secondController), - child: AnimatedOpacity( - duration: const Duration(milliseconds: 300), + top: winH / 1.4, + child:AnimatedOpacity( + duration: const Duration(milliseconds: 400), opacity: _animEnd ? 1.0 : 0.0, - child: ShaderMask( - shaderCallback: _buildShader, - child: Text( - 'Flutter Unit', - style: shadowStyle, - ))), - ), - ), + child: Text( + 'Flutter Unit', + style: shadowStyle, + )), ); } final colors = [Colors.red, Colors.yellow, Colors.blue]; - Shader _buildShader(Rect bounds) => RadialGradient( - center: Alignment.topLeft, - radius: 1.0, - tileMode: TileMode.mirror, - colors: colors) - .createShader(bounds); Widget buildLogo(Color primaryColor) { return SlideTransition( diff --git a/lib/views/widgets/MultiChildRenderObjectWidget/Column/node1_base.dart b/lib/views/widgets/MultiChildRenderObjectWidget/Column/node1_base.dart index 66828d1..8af2ac7 100644 --- a/lib/views/widgets/MultiChildRenderObjectWidget/Column/node1_base.dart +++ b/lib/views/widgets/MultiChildRenderObjectWidget/Column/node1_base.dart @@ -1,10 +1,9 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-30 /// contact me by email 1981462002@qq.com /// 说明: // { -// "widgetId": 95, +// "widgetId": 96, // "name": 'Column基本使用', // "priority": 1, // "subtitle": diff --git a/lib/views/widgets/MultiChildRenderObjectWidget/Flex/node1_direction.dart b/lib/views/widgets/MultiChildRenderObjectWidget/Flex/node1_direction.dart index c3beea8..6745f7d 100644 --- a/lib/views/widgets/MultiChildRenderObjectWidget/Flex/node1_direction.dart +++ b/lib/views/widgets/MultiChildRenderObjectWidget/Flex/node1_direction.dart @@ -6,7 +6,7 @@ import 'package:flutter/material.dart'; // { // "widgetId": 94, -// "name": 'Flex的排布方向基本使用', +// "name": 'Flex的排布方向', // "priority": 1, // "subtitle": // "【children】 : 组件列表 【List】\n" diff --git a/lib/views/widgets/MultiChildRenderObjectWidget/RichText/node1_base.dart b/lib/views/widgets/MultiChildRenderObjectWidget/RichText/node1_base.dart index 842a695..5aa4a78 100644 --- a/lib/views/widgets/MultiChildRenderObjectWidget/RichText/node1_base.dart +++ b/lib/views/widgets/MultiChildRenderObjectWidget/RichText/node1_base.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:flutter_unit/app/utils/color_utils.dart'; +import '../../../../app/utils/color_utils.dart'; /// create by 张风捷特烈 on 2020-03-30 /// contact me by email 1981462002@qq.com /// 说明: diff --git a/lib/views/widgets/MultiChildRenderObjectWidget/RichText/node2_widget.dart b/lib/views/widgets/MultiChildRenderObjectWidget/RichText/node2_widget.dart index de79363..9c7c145 100644 --- a/lib/views/widgets/MultiChildRenderObjectWidget/RichText/node2_widget.dart +++ b/lib/views/widgets/MultiChildRenderObjectWidget/RichText/node2_widget.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter_unit/app/utils/color_utils.dart'; /// create by 张风捷特烈 on 2020-03-30 /// contact me by email 1981462002@qq.com /// 说明: diff --git a/lib/views/widgets/MultiChildRenderObjectWidget/Row/node1_base.dart b/lib/views/widgets/MultiChildRenderObjectWidget/Row/node1_base.dart index 04bea20..2732a51 100644 --- a/lib/views/widgets/MultiChildRenderObjectWidget/Row/node1_base.dart +++ b/lib/views/widgets/MultiChildRenderObjectWidget/Row/node1_base.dart @@ -1,4 +1,3 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-03-30 /// contact me by email 1981462002@qq.com diff --git a/lib/views/widgets/Other/Table/node1_base.dart b/lib/views/widgets/Other/Table/node1_base.dart index 1d9f9fe..dab4708 100644 --- a/lib/views/widgets/Other/Table/node1_base.dart +++ b/lib/views/widgets/Other/Table/node1_base.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; - +/// create by 张风捷特烈 on 2020/4/30 +/// contact me by email 1981462002@qq.com +/// 说明: // { // "widgetId": 110, // "name": 'Table基本使用', diff --git a/lib/views/widgets/ProxyWidget/DefaultTextStyle/node1_base.dart b/lib/views/widgets/ProxyWidget/DefaultTextStyle/node1_base.dart index decbd62..f7d5634 100644 --- a/lib/views/widgets/ProxyWidget/DefaultTextStyle/node1_base.dart +++ b/lib/views/widgets/ProxyWidget/DefaultTextStyle/node1_base.dart @@ -1,4 +1,4 @@ -import 'package:flutter/cupertino.dart'; + import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-12 diff --git a/lib/views/widgets/ProxyWidget/Expanded/node1_base.dart b/lib/views/widgets/ProxyWidget/Expanded/node1_base.dart index 89165b7..9896200 100644 --- a/lib/views/widgets/ProxyWidget/Expanded/node1_base.dart +++ b/lib/views/widgets/ProxyWidget/Expanded/node1_base.dart @@ -1,5 +1,5 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_unit/app/utils/color_utils.dart'; + import 'package:flutter/material.dart'; + import '../../../../app/utils/color_utils.dart'; /// create by 张风捷特烈 on 2020-03-22 /// contact me by email 1981462002@qq.com diff --git a/lib/views/widgets/ProxyWidget/Flexible/node1_base.dart b/lib/views/widgets/ProxyWidget/Flexible/node1_base.dart index 8451be1..08616f5 100644 --- a/lib/views/widgets/ProxyWidget/Flexible/node1_base.dart +++ b/lib/views/widgets/ProxyWidget/Flexible/node1_base.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter_unit/app/utils/color_utils.dart'; /// create by 张风捷特烈 on 2020-03-22 /// contact me by email 1981462002@qq.com diff --git a/lib/views/widgets/ProxyWidget/Positioned/node1_base.dart b/lib/views/widgets/ProxyWidget/Positioned/node1_base.dart index 51f7026..0e249eb 100644 --- a/lib/views/widgets/ProxyWidget/Positioned/node1_base.dart +++ b/lib/views/widgets/ProxyWidget/Positioned/node1_base.dart @@ -7,7 +7,7 @@ import 'package:flutter/material.dart'; // { // "widgetId": 108, // "name": 'Positioned基本使用', -// "priority": 2, +// "priority": 1, // "subtitle": // "【child】 : 组件 【Widget】\n" // "【top】 : 到父顶距离 【double】\n" diff --git a/lib/views/widgets/SingleChildRenderObjectWidget/AbsorbPointer/node1_base.dart b/lib/views/widgets/SingleChildRenderObjectWidget/AbsorbPointer/node1_base.dart index 85c7e8d..ec83929 100644 --- a/lib/views/widgets/SingleChildRenderObjectWidget/AbsorbPointer/node1_base.dart +++ b/lib/views/widgets/SingleChildRenderObjectWidget/AbsorbPointer/node1_base.dart @@ -1,12 +1,11 @@ import 'package:flutter/material.dart'; -import 'package:flutter_unit/views/dialogs/dialog_about.dart'; /// create by 张风捷特烈 on 2020-04-19 /// contact me by email 1981462002@qq.com /// 说明: // { -// "widgetId": 292, +// "widgetId": 295, // "name": 'AbsorbPointer基本使用', // "priority": 1, // "subtitle": @@ -51,7 +50,7 @@ class _CustomAbsorbPointerState extends State { 'To About', style: TextStyle(color: Colors.white), ), - onPressed: () => DialogAbout.show(context)); + onPressed: () => Navigator.of(context).pushNamed('AboutMePage')); _buildSwitch() => Switch( value: _absorbing, diff --git a/lib/views/widgets/SingleChildRenderObjectWidget/Align/node1_base.dart b/lib/views/widgets/SingleChildRenderObjectWidget/Align/node1_base.dart index fcdac1a..d396cd4 100644 --- a/lib/views/widgets/SingleChildRenderObjectWidget/Align/node1_base.dart +++ b/lib/views/widgets/SingleChildRenderObjectWidget/Align/node1_base.dart @@ -1,4 +1,3 @@ -import 'dart:math'; import 'package:flutter/material.dart'; /// create by 张风捷特烈 on 2020-04-19 diff --git a/lib/views/widgets/SingleChildRenderObjectWidget/AnimatedSize/node1_base.dart b/lib/views/widgets/SingleChildRenderObjectWidget/AnimatedSize/node1_base.dart index 19137f0..df49a4b 100644 --- a/lib/views/widgets/SingleChildRenderObjectWidget/AnimatedSize/node1_base.dart +++ b/lib/views/widgets/SingleChildRenderObjectWidget/AnimatedSize/node1_base.dart @@ -6,7 +6,7 @@ import 'package:flutter/material.dart'; // { // "widgetId": 201, -// "name": 'AnimatedAlign基本使用', +// "name": 'AnimatedSize基本使用', // "priority": 1, // "subtitle": // "【child】 : 孩子组件 【Widget】\n" diff --git a/lib/views/widgets/SingleChildRenderObjectWidget/AspectRatio/node1_base.dart b/lib/views/widgets/SingleChildRenderObjectWidget/AspectRatio/node1_base.dart index 51ce571..137128c 100644 --- a/lib/views/widgets/SingleChildRenderObjectWidget/AspectRatio/node1_base.dart +++ b/lib/views/widgets/SingleChildRenderObjectWidget/AspectRatio/node1_base.dart @@ -1,4 +1,7 @@ import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020/4/30 +/// contact me by email 1981462002@qq.com +/// 说明: // { // "widgetId": 77, // "name": 'AspectRatio基本使用', diff --git a/lib/views/widgets/SingleChildRenderObjectWidget/ColorFiltered/node1_base.dart b/lib/views/widgets/SingleChildRenderObjectWidget/ColorFiltered/node1_base.dart index 00f111b..928447f 100644 --- a/lib/views/widgets/SingleChildRenderObjectWidget/ColorFiltered/node1_base.dart +++ b/lib/views/widgets/SingleChildRenderObjectWidget/ColorFiltered/node1_base.dart @@ -1,12 +1,12 @@ import 'package:flutter/material.dart'; -import 'package:flutter_unit/app/utils/color_utils.dart'; +import '../../../../app/utils/color_utils.dart'; /// create by 张风捷特烈 on 2020-04-19 /// contact me by email 1981462002@qq.com /// 说明: // { // "widgetId": 88, -// "name": 'FittedBox基本使用', +// "name": 'ColorFiltered基本使用', // "priority": 1, // "subtitle": // "【child】 : 孩子组件 【Widget】\n" diff --git a/lib/views/widgets/SingleChildRenderObjectWidget/DecoratedBox/node1_base.dart b/lib/views/widgets/SingleChildRenderObjectWidget/DecoratedBox/node1_base.dart index a30410e..c4435a2 100644 --- a/lib/views/widgets/SingleChildRenderObjectWidget/DecoratedBox/node1_base.dart +++ b/lib/views/widgets/SingleChildRenderObjectWidget/DecoratedBox/node1_base.dart @@ -9,11 +9,10 @@ import 'package:flutter/material.dart'; // "priority": 1, // "subtitle": // "【decoration】 : 装饰对象 【Decoration】\n" -// "【decoration】 : 裁剪行为 【Clip】\n" // "【position】 : 前景色(左)/后景色(右) 【DecorationPosition】", // } -class CustomDecoratedBox extends StatelessWidget { - final rainbow = [ +class BoxDecorationDemo extends StatelessWidget { + final rainbow = const [ 0xffff0000, 0xffFF7F00, 0xffFFFF00, @@ -25,48 +24,16 @@ class CustomDecoratedBox extends StatelessWidget { @override Widget build(BuildContext context) { - return Wrap( - spacing: 30, - children: [_buildDecoratedBox1(), _buildDecoratedBox2()], - ); - } - - Widget _buildDecoratedBox2() { - return DecoratedBox( - position: DecorationPosition.foreground, - decoration: BoxDecoration( - border: Border(left: BorderSide(color: Colors.black, width: 2)), - //添加渐变色 - gradient: LinearGradient( - stops: [0.0, 1 / 6, 2 / 6, 3 / 6, 4 / 6, 5 / 6, 1.0], - colors: rainbow.map((e) => Color(e)).toList()), - boxShadow: [ - BoxShadow( - color: Colors.orangeAccent, - offset: Offset(1, 1), - blurRadius: 10, - spreadRadius: 1), - ]), - child: Icon( - Icons.android, - size: 80, - color: Colors.black.withAlpha(123), - ), - ); - } - - Widget _buildDecoratedBox1() { return DecoratedBox( position: DecorationPosition.background, decoration: BoxDecoration( - //添加渐变色 gradient: LinearGradient( stops: [0.0, 1 / 6, 2 / 6, 3 / 6, 4 / 6, 5 / 6, 1.0], colors: rainbow.map((e) => Color(e)).toList()), borderRadius: BorderRadius.only( - topLeft: Radius.circular(20), bottomRight: Radius.circular(40)), + topLeft: Radius.circular(20), bottomRight: Radius.circular(20)), boxShadow: [ - BoxShadow( + const BoxShadow( color: Colors.orangeAccent, offset: Offset(1, 1), blurRadius: 10, diff --git a/lib/views/widgets/SingleChildRenderObjectWidget/DecoratedBox/node2_image.dart b/lib/views/widgets/SingleChildRenderObjectWidget/DecoratedBox/node2_image.dart new file mode 100644 index 0000000..f30aece --- /dev/null +++ b/lib/views/widgets/SingleChildRenderObjectWidget/DecoratedBox/node2_image.dart @@ -0,0 +1,36 @@ +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020-04-19 +/// contact me by email 1981462002@qq.com +/// 说明: + +// { +// "widgetId": 70, +// "name": 'DecoratedBox形状和图片装饰', +// "priority": 2, +// "subtitle": +// "【shape】 : 形状 【BoxShape】\n" +// "【image】 : 背景图片 【DecorationImage】\n", +// } +class ShapeImageDemo extends StatelessWidget { + @override + Widget build(BuildContext context) { + return DecoratedBox( + decoration: BoxDecoration( + shape: BoxShape.circle, + image: DecorationImage( + fit: BoxFit.cover, + image: AssetImage( + 'assets/images/wy_200x300.jpg', + ))), + child: SizedBox( + height: 80, + width: 80, + child: Icon( + Icons.ac_unit, + color: Colors.white, + size: 40, + ), + ), + ); + } +} diff --git a/lib/views/widgets/SingleChildRenderObjectWidget/DecoratedBox/node3_border.dart b/lib/views/widgets/SingleChildRenderObjectWidget/DecoratedBox/node3_border.dart new file mode 100644 index 0000000..39f7c76 --- /dev/null +++ b/lib/views/widgets/SingleChildRenderObjectWidget/DecoratedBox/node3_border.dart @@ -0,0 +1,32 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/4/30 +/// contact me by email 1981462002@qq.com +/// 说明: +// { +// "widgetId": 70, +// "name": 'DecoratedBox边线装饰', +// "priority": 3, +// "subtitle": "【border】 : 边线 【BoxBorder】\n", +// } +class BorderDemo extends StatelessWidget { + @override + Widget build(BuildContext context) { + return DecoratedBox( + position: DecorationPosition.foreground, + decoration: BoxDecoration( + border: Border( + bottom: BorderSide(color: Colors.orange, width: 2), + top: BorderSide(color: Colors.orange, width: 2)), + ), + child: SizedBox( + height: 80, + width: 100, + child: Image.asset( + 'assets/images/wy_200x300.jpg', + fit: BoxFit.cover, + ), + ), + ); + } +} \ No newline at end of file diff --git a/lib/views/widgets/SingleChildRenderObjectWidget/DecoratedBox/node4_shape.dart b/lib/views/widgets/SingleChildRenderObjectWidget/DecoratedBox/node4_shape.dart new file mode 100644 index 0000000..54d8ecb --- /dev/null +++ b/lib/views/widgets/SingleChildRenderObjectWidget/DecoratedBox/node4_shape.dart @@ -0,0 +1,43 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/4/30 +/// contact me by email 1981462002@qq.com +/// 说明: +// { +// "widgetId": 70, +// "name": 'DecoratedBox形状装饰', +// "priority": 4, +// "subtitle": "通过ShapeDecoration对象可指定边线形状\n", +// } +class ShapeDecorationDemo extends StatelessWidget { + @override + Widget build(BuildContext context) { + return DecoratedBox( + decoration: ShapeDecoration( + shadows: [ + const BoxShadow( + color: Colors.orangeAccent, + offset: Offset(0, 0), + blurRadius: 2, + spreadRadius: 1), + ], + image: DecorationImage( + fit: BoxFit.cover, + image: AssetImage( + 'assets/images/wy_200x300.jpg', + )), + shape: CircleBorder( + side: BorderSide(width: 1.0, color: Colors.orangeAccent), + )), + child: SizedBox( + height: 100, + width: 100, + child: Icon( + Icons.ac_unit, + color: Colors.white, + size: 40, + ), + ), + ); + } +} \ No newline at end of file diff --git a/lib/views/widgets/SingleChildRenderObjectWidget/DecoratedBox/node5_line.dart b/lib/views/widgets/SingleChildRenderObjectWidget/DecoratedBox/node5_line.dart new file mode 100644 index 0000000..0128892 --- /dev/null +++ b/lib/views/widgets/SingleChildRenderObjectWidget/DecoratedBox/node5_line.dart @@ -0,0 +1,26 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/4/30 +/// contact me by email 1981462002@qq.com +/// 说明: +// { +// "widgetId": 70, +// "name": 'DecoratedBox底线装饰', +// "priority": 5, +// "subtitle": "通过UnderlineTabIndicator对象可指定底线\n", +// } +class UnderlineTabIndicatorDemo extends StatelessWidget { + @override + Widget build(BuildContext context) { + return DecoratedBox( + decoration: UnderlineTabIndicator( + insets: EdgeInsets.symmetric(horizontal: 5, vertical: -5), + borderSide: BorderSide(color: Colors.orange, width: 2)), + child: Icon( + Icons.ac_unit, + color: Colors.blue, + size: 40, + ), + ); + } +} \ No newline at end of file diff --git a/lib/views/widgets/SingleChildRenderObjectWidget/DecoratedBox/node6_flutterLogo.dart b/lib/views/widgets/SingleChildRenderObjectWidget/DecoratedBox/node6_flutterLogo.dart new file mode 100644 index 0000000..573856c --- /dev/null +++ b/lib/views/widgets/SingleChildRenderObjectWidget/DecoratedBox/node6_flutterLogo.dart @@ -0,0 +1,27 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/4/30 +/// contact me by email 1981462002@qq.com +/// 说明: +// { +// "widgetId": 70, +// "name": 'FlutterLogoDecoration装饰', +// "priority": 6, +// "subtitle": "通过FlutterLogoDecoration对象可指定Flutter图标装饰(并没有什么太大的作用)\n", +// } + +class FlutterLogoDecorationDemo extends StatelessWidget { + @override + Widget build(BuildContext context) { + return DecoratedBox( + decoration: FlutterLogoDecoration( + darkColor: Colors.orange, + lightColor: Colors.deepPurpleAccent, + style: FlutterLogoStyle.stacked), + child: SizedBox( + width: 100, + height: 100, + ), + ); + } +} diff --git a/lib/views/widgets/SingleChildRenderObjectWidget/FittedBox/node1_base.dart b/lib/views/widgets/SingleChildRenderObjectWidget/FittedBox/node1_base.dart index 9dd113a..7cb27cb 100644 --- a/lib/views/widgets/SingleChildRenderObjectWidget/FittedBox/node1_base.dart +++ b/lib/views/widgets/SingleChildRenderObjectWidget/FittedBox/node1_base.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:flutter_unit/app/res/cons.dart'; + /// create by 张风捷特烈 on 2020-04-19 /// contact me by email 1981462002@qq.com /// 说明: @@ -22,6 +22,16 @@ class _CustomFittedBoxState extends State { double _childW = 20; double _childH = 30; + final rainbow = [ + 0xffff0000, + 0xffFF7F00, + 0xffFFFF00, + 0xff00FF00, + 0xff00FFFF, + 0xff0000FF, + 0xff8B00FF + ]; + @override Widget build(BuildContext context) { return Column( @@ -59,7 +69,7 @@ class _CustomFittedBoxState extends State { //添加渐变色 gradient: LinearGradient( stops: [0.0, 1 / 6, 2 / 6, 3 / 6, 4 / 6, 5 / 6, 1.0], - colors: Cons.rainbow.map((e) => Color(e)).toList()), + colors: rainbow.map((e) => Color(e)).toList()), ), ), ), diff --git a/lib/views/widgets/SingleChildRenderObjectWidget/FractionallySizedBox/node1_base.dart b/lib/views/widgets/SingleChildRenderObjectWidget/FractionallySizedBox/node1_base.dart index 3cd88e6..362200b 100644 --- a/lib/views/widgets/SingleChildRenderObjectWidget/FractionallySizedBox/node1_base.dart +++ b/lib/views/widgets/SingleChildRenderObjectWidget/FractionallySizedBox/node1_base.dart @@ -4,7 +4,7 @@ import 'package:flutter/material.dart'; /// 说明: // { -// "widgetId": 81, +// "widgetId": 82, // "name": 'FractionallySizedBox基本使用', // "priority": 1, // "subtitle": diff --git a/lib/views/widgets/SingleChildRenderObjectWidget/IgnorePointer/node1_base.dart b/lib/views/widgets/SingleChildRenderObjectWidget/IgnorePointer/node1_base.dart index 1982267..f6247ff 100644 --- a/lib/views/widgets/SingleChildRenderObjectWidget/IgnorePointer/node1_base.dart +++ b/lib/views/widgets/SingleChildRenderObjectWidget/IgnorePointer/node1_base.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter_unit/views/dialogs/dialog_about.dart'; /// create by 张风捷特烈 on 2020-04-19 /// contact me by email 1981462002@qq.com @@ -51,7 +50,7 @@ class _CustomIgnorePointerState extends State { 'To About', style: TextStyle(color: Colors.white), ), - onPressed: () => DialogAbout.show(context)); + onPressed: () => Navigator.of(context).pushNamed('AboutMePage')); _buildSwitch() => Switch( value: _ignore, diff --git a/lib/views/widgets/SingleChildRenderObjectWidget/Opacity/node1_base.dart b/lib/views/widgets/SingleChildRenderObjectWidget/Opacity/node1_base.dart index 14e23df..301240f 100644 --- a/lib/views/widgets/SingleChildRenderObjectWidget/Opacity/node1_base.dart +++ b/lib/views/widgets/SingleChildRenderObjectWidget/Opacity/node1_base.dart @@ -25,10 +25,10 @@ class _CustomOpacityState extends State { children: [_buildSlider(), _buildOpacity()], ); } - + // 创建Opacity Widget _buildOpacity() => Opacity( opacity: _opacity, - child: Image.asset( + child: Image.asset(// 图片 'assets/images/icon_head.png', width: 100, ), diff --git a/lib/views/widgets/SingleChildRenderObjectWidget/Padding/node1_all.dart b/lib/views/widgets/SingleChildRenderObjectWidget/Padding/node1_all.dart new file mode 100644 index 0000000..0f3da50 --- /dev/null +++ b/lib/views/widgets/SingleChildRenderObjectWidget/Padding/node1_all.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/5/3 +/// contact me by email 1981462002@qq.com +/// 说明: + +// { +// "widgetId": 74, +// "name": 'Padding四面等边距', +// "priority": 1, +// "subtitle": +// "【child】 : 孩子组件 【Widget】\n" +// "【padding】 : 内四边距 【EdgeInsetsGeometry】" +// "EdgeInsets.all用来限定相同的四边边距", +// } +class PaddingAll extends StatelessWidget { + + @override + Widget build(BuildContext context) { + return Container( + color: Colors.grey.withAlpha(22), + width: 200, + height: 150, + child: Padding( + padding: EdgeInsets.all(20), + child: _buildChild(), + ), + ); + } + + Widget _buildChild() { + return Container( + alignment: Alignment.center, + color: Colors.cyanAccent, + width: 100, + height: 100, + child: Text("孩子"), + ); + } +} \ No newline at end of file diff --git a/lib/views/widgets/SingleChildRenderObjectWidget/Padding/node2_only.dart b/lib/views/widgets/SingleChildRenderObjectWidget/Padding/node2_only.dart new file mode 100644 index 0000000..81bdb00 --- /dev/null +++ b/lib/views/widgets/SingleChildRenderObjectWidget/Padding/node2_only.dart @@ -0,0 +1,38 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/5/3 +/// contact me by email 1981462002@qq.com +/// 说明: + +// { +// "widgetId": 74, +// "name": 'Padding单独边距边距', +// "priority": 2, +// "subtitle": +// "EdgeInsets.only用来限定相同的四边边距", +// } +class PaddingOnly extends StatelessWidget { + + @override + Widget build(BuildContext context) { + return Container( + color: Colors.grey.withAlpha(22), + width: 200, + height: 150, + child: Padding( + padding: EdgeInsets.only(top:10,left: 10), + child: _buildChild(), + ), + ); + } + + Widget _buildChild() { + return Container( + alignment: Alignment.center, + color: Colors.cyanAccent, + width: 100, + height: 100, + child: Text("孩子"), + ); + } +} \ No newline at end of file diff --git a/lib/views/widgets/SingleChildRenderObjectWidget/Padding/node3_symmetric.dart b/lib/views/widgets/SingleChildRenderObjectWidget/Padding/node3_symmetric.dart new file mode 100644 index 0000000..2c7c643 --- /dev/null +++ b/lib/views/widgets/SingleChildRenderObjectWidget/Padding/node3_symmetric.dart @@ -0,0 +1,38 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/5/3 +/// contact me by email 1981462002@qq.com +/// 说明: + +// { +// "widgetId": 74, +// "name": 'Padding方向边距', +// "priority": 3, +// "subtitle": +// "EdgeInsets.symmetric用来限定水平和竖直方向的边距", +// } +class PaddingSymmetric extends StatelessWidget { + + @override + Widget build(BuildContext context) { + return Container( + color: Colors.grey.withAlpha(22), + width: 200, + height: 150, + child: Padding( + padding: EdgeInsets.symmetric(vertical: 30,horizontal: 10), + child: _buildChild(), + ), + ); + } + + Widget _buildChild() { + return Container( + alignment: Alignment.center, + color: Colors.cyanAccent, + width: 100, + height: 100, + child: Text("孩子"), + ); + } +} \ No newline at end of file diff --git a/lib/views/widgets/SingleChildRenderObjectWidget/Transform/node1_skew.dart b/lib/views/widgets/SingleChildRenderObjectWidget/Transform/node1_skew.dart index d06d6cc..6bfa97b 100644 --- a/lib/views/widgets/SingleChildRenderObjectWidget/Transform/node1_skew.dart +++ b/lib/views/widgets/SingleChildRenderObjectWidget/Transform/node1_skew.dart @@ -1,5 +1,4 @@ import 'dart:math'; -import 'dart:math' as prefix0; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; diff --git a/lib/views/widgets/SingleChildRenderObjectWidget/Transform/node5_perspective.dart b/lib/views/widgets/SingleChildRenderObjectWidget/Transform/node5_perspective.dart index 69b1546..fb21a00 100644 --- a/lib/views/widgets/SingleChildRenderObjectWidget/Transform/node5_perspective.dart +++ b/lib/views/widgets/SingleChildRenderObjectWidget/Transform/node5_perspective.dart @@ -11,7 +11,7 @@ import 'package:flutter/material.dart'; // "name": '透视变换rotation', // "priority": 5, // "subtitle": -// "由R3C1、R3C2、R3C3控制透视" +// "由R3C1、R3C2、R3C3控制透视", // } class R3C2 extends StatefulWidget { @override diff --git a/lib/views/widgets/Sliver/CustomScrollView/node1_base.dart b/lib/views/widgets/Sliver/CustomScrollView/node1_base.dart index c0ac2bd..f8c7db1 100644 --- a/lib/views/widgets/Sliver/CustomScrollView/node1_base.dart +++ b/lib/views/widgets/Sliver/CustomScrollView/node1_base.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter_unit/app/utils/color_utils.dart'; /// create by 张风捷特烈 on 2020-03-30 /// contact me by email 1981462002@qq.com diff --git a/lib/views/widgets/Sliver/FlexibleSpaceBar/node1_base.dart b/lib/views/widgets/Sliver/FlexibleSpaceBar/node1_base.dart index 9240e84..600a198 100644 --- a/lib/views/widgets/Sliver/FlexibleSpaceBar/node1_base.dart +++ b/lib/views/widgets/Sliver/FlexibleSpaceBar/node1_base.dart @@ -3,12 +3,11 @@ /// 说明: import 'package:flutter/material.dart'; -import 'package:flutter_unit/app/utils/color_utils.dart'; /// 说明: // { // "widgetId": 196, -// "name": 'SliverAppBar基本使用', +// "name": 'FlexibleSpaceBar基本使用', // "priority": 1, // "subtitle": // "【title】 : 标题组件 【Widget】\n" diff --git a/lib/views/widgets/Sliver/SliverAppBar/node1_base.dart b/lib/views/widgets/Sliver/SliverAppBar/node1_base.dart index 8a78706..67dd92e 100644 --- a/lib/views/widgets/Sliver/SliverAppBar/node1_base.dart +++ b/lib/views/widgets/Sliver/SliverAppBar/node1_base.dart @@ -1,11 +1,10 @@ import 'package:flutter/material.dart'; -import 'package:flutter_unit/app/utils/color_utils.dart'; /// create by 张风捷特烈 on 2020-03-30 /// contact me by email 1981462002@qq.com /// 说明: // { -// "widgetId": 183, +// "widgetId": 184, // "name": 'SliverAppBar基本使用', // "priority": 1, // "subtitle": diff --git a/lib/views/widgets/Sliver/SliverFillViewport/node1_base.dart b/lib/views/widgets/Sliver/SliverFillViewport/node1_base.dart index d809bfb..b27cf12 100644 --- a/lib/views/widgets/Sliver/SliverFillViewport/node1_base.dart +++ b/lib/views/widgets/Sliver/SliverFillViewport/node1_base.dart @@ -4,8 +4,8 @@ import 'package:flutter/material.dart'; /// contact me by email 1981462002@qq.com /// 说明: // { -// "widgetId": 186, -// "name": 'SliverFixedExtentList基本使用', +// "widgetId": 187, +// "name": 'SliverFillViewport基本使用', // "priority": 1, // "subtitle": // "【viewportFraction】 : 视口分率 【double】\n" diff --git a/lib/views/widgets/Sliver/SliverGrid/node1_base.dart b/lib/views/widgets/Sliver/SliverGrid/node1_base.dart index eda5d5e..298ac32 100644 --- a/lib/views/widgets/Sliver/SliverGrid/node1_base.dart +++ b/lib/views/widgets/Sliver/SliverGrid/node1_base.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter_unit/app/utils/color_utils.dart'; /// create by 张风捷特烈 on 2020-03-30 /// contact me by email 1981462002@qq.com diff --git a/lib/views/widgets/Sliver/SliverList/node1_base.dart b/lib/views/widgets/Sliver/SliverList/node1_base.dart index b907238..1ae36b5 100644 --- a/lib/views/widgets/Sliver/SliverList/node1_base.dart +++ b/lib/views/widgets/Sliver/SliverList/node1_base.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter_unit/app/utils/color_utils.dart'; /// create by 张风捷特烈 on 2020-03-30 /// contact me by email 1981462002@qq.com diff --git a/lib/views/widgets/StatefulWidget/AlignTransition/node1_base.dart b/lib/views/widgets/StatefulWidget/AlignTransition/node1_base.dart index 861bd0b..4973ebe 100644 --- a/lib/views/widgets/StatefulWidget/AlignTransition/node1_base.dart +++ b/lib/views/widgets/StatefulWidget/AlignTransition/node1_base.dart @@ -1,6 +1,8 @@ -import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; +import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020/4/30 +/// contact me by email 1981462002@qq.com +/// 说明: // { // "widgetId": 111, // "name": 'AlignTransition基本使用', diff --git a/lib/views/widgets/StatefulWidget/BottomAppBar/node1_base.dart b/lib/views/widgets/StatefulWidget/BottomAppBar/node1_base.dart index d3b439c..1cfcb9f 100755 --- a/lib/views/widgets/StatefulWidget/BottomAppBar/node1_base.dart +++ b/lib/views/widgets/StatefulWidget/BottomAppBar/node1_base.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:flutter_unit/views/dialogs/dialog_about.dart'; + /// create by 张风捷特烈 on 2020-03-23 /// contact me by email 1981462002@qq.com @@ -39,7 +39,7 @@ class _CustomBottomAppBarState extends State { child: Scaffold( backgroundColor: Colors.purple.withAlpha(22), floatingActionButton: FloatingActionButton( - onPressed: () => DialogAbout.show(context), + onPressed: () => Navigator.of(context).pushNamed('AboutMePage'), child: Icon(Icons.add), ), bottomNavigationBar: _buildBottomAppBar(), diff --git a/lib/views/widgets/StatefulWidget/Checkbox/node1_base.dart b/lib/views/widgets/StatefulWidget/Checkbox/node1_base.dart index a6af6ab..436123b 100644 --- a/lib/views/widgets/StatefulWidget/Checkbox/node1_base.dart +++ b/lib/views/widgets/StatefulWidget/Checkbox/node1_base.dart @@ -11,7 +11,7 @@ import 'package:flutter/material.dart'; // "【value】 : 是否选中 【double】\n" // "【checkColor】: 选中时✔️gou颜色 【Color】\n" // "【activeColor】: 选中时框内颜色 【Color】\n" -// "【onChanged】: 状态改变事件 【Function(bool)】\n" +// "【onChanged】: 状态改变事件 【Function(bool)】\n", // } class CustomCheckbox extends StatefulWidget { diff --git a/lib/views/widgets/StatefulWidget/CupertinoActivityIndicator/node1_base.dart b/lib/views/widgets/StatefulWidget/CupertinoActivityIndicator/node1_base.dart index 0eb3e3a..5a2d48f 100644 --- a/lib/views/widgets/StatefulWidget/CupertinoActivityIndicator/node1_base.dart +++ b/lib/views/widgets/StatefulWidget/CupertinoActivityIndicator/node1_base.dart @@ -9,7 +9,7 @@ import 'package:flutter/material.dart'; // "priority": 1, // "subtitle": // "【animating】 : 是否loading动画 【bool】\n" -// "【radius】 : 半径 【double】" +// "【radius】 : 半径 【double】", // } class CustomCupertinoActivityIndicator extends StatelessWidget { diff --git a/lib/views/widgets/StatefulWidget/CupertinoButton/node1_base.dart b/lib/views/widgets/StatefulWidget/CupertinoButton/node1_base.dart index 21bf7c1..ade5190 100755 --- a/lib/views/widgets/StatefulWidget/CupertinoButton/node1_base.dart +++ b/lib/views/widgets/StatefulWidget/CupertinoButton/node1_base.dart @@ -15,7 +15,6 @@ // } import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_unit/views/dialogs/dialog_about.dart'; class CustomCupertinoButton extends StatelessWidget { @override @@ -29,7 +28,7 @@ class CustomCupertinoButton extends StatelessWidget { spacing: 20, children:data.keys.map((e)=> CupertinoButton( padding: EdgeInsets.zero, - onPressed: () => DialogAbout.show(context), + onPressed: () => Navigator.of(context).pushNamed('AboutMePage'), color: e, pressedOpacity: 0.4, borderRadius: BorderRadius.all(Radius.circular(data[e])), diff --git a/lib/views/widgets/StatefulWidget/CupertinoContextMenuAction/node1_base.dart b/lib/views/widgets/StatefulWidget/CupertinoContextMenuAction/node1_base.dart index 0ec6b05..e6770c5 100644 --- a/lib/views/widgets/StatefulWidget/CupertinoContextMenuAction/node1_base.dart +++ b/lib/views/widgets/StatefulWidget/CupertinoContextMenuAction/node1_base.dart @@ -13,7 +13,6 @@ // } import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_unit/views/dialogs/dialog_about.dart'; class CustomCupertinoContextMenuAction extends StatelessWidget { @override @@ -26,7 +25,7 @@ class CustomCupertinoContextMenuAction extends StatelessWidget { child: CupertinoContextMenuAction( trailingIcon: CupertinoIcons.settings, isDefaultAction: true, - onPressed: () => DialogAbout.show(context), + onPressed: () => Navigator.of(context).pushNamed('AboutMePage'), child: Text('张风捷特烈')), ), Container( @@ -35,7 +34,7 @@ class CustomCupertinoContextMenuAction extends StatelessWidget { child: CupertinoContextMenuAction( trailingIcon: CupertinoIcons.home, isDefaultAction: false, - onPressed: () => DialogAbout.show(context), + onPressed: () => Navigator.of(context).pushNamed('AboutMePage'), child: Text('百里·巫缨')), ), ], diff --git a/lib/views/widgets/StatefulWidget/CupertinoTabBar/node1_base.dart b/lib/views/widgets/StatefulWidget/CupertinoTabBar/node1_base.dart index a3c6aeb..69fe867 100755 --- a/lib/views/widgets/StatefulWidget/CupertinoTabBar/node1_base.dart +++ b/lib/views/widgets/StatefulWidget/CupertinoTabBar/node1_base.dart @@ -5,12 +5,11 @@ import 'package:flutter/material.dart'; /// 说明: // { // "widgetId": 63, -// "name": 'CupertinoNavigationBar基本用法', +// "name": 'CupertinoTabBar基本用法', // "priority": 1, // "subtitle": // "【currentIndex】 : 当前激活索引 【Widget】\n" // "【items】 : 条目组件 【Widget】\n" -// "【trailing】 : 尾部组件 【Widget】\n" // "【backgroundColor】 : 背景色 【Color】\n" // "【inactiveColor】 : 非激活色 【Color】\n" // "【activeColor】 : 激活色 【Color】\n" diff --git a/lib/views/widgets/StatefulWidget/DefaultTextStyleTransition/node1_base.dart b/lib/views/widgets/StatefulWidget/DefaultTextStyleTransition/node1_base.dart index dee90ed..334508e 100644 --- a/lib/views/widgets/StatefulWidget/DefaultTextStyleTransition/node1_base.dart +++ b/lib/views/widgets/StatefulWidget/DefaultTextStyleTransition/node1_base.dart @@ -4,7 +4,7 @@ import 'package:flutter/material.dart'; /// contact me by email 1981462002@qq.com /// 说明: // { -// "widgetId": 113, +// "widgetId": 114, // "name": 'DefaultTextStyleTransition基本使用', // "priority": 1, // "subtitle": diff --git a/lib/views/widgets/StatefulWidget/Draggable/node3_use.dart b/lib/views/widgets/StatefulWidget/Draggable/node3_use.dart index 9fbc041..2608cf7 100644 --- a/lib/views/widgets/StatefulWidget/Draggable/node3_use.dart +++ b/lib/views/widgets/StatefulWidget/Draggable/node3_use.dart @@ -9,7 +9,7 @@ import 'package:flutter/material.dart'; // "name": 'Draggable其他使用', // "priority": 3, // "subtitle": -// "可以根据拖拽来处理一些事件。如删除、查询、弹框等" +// "可以根据拖拽来处理一些事件。如删除、查询、弹框等", // } class DeleteDraggable extends StatefulWidget { diff --git a/lib/views/widgets/StatefulWidget/DropdownButton/node1_base.dart b/lib/views/widgets/StatefulWidget/DropdownButton/node1_base.dart index 560b853..6accccc 100644 --- a/lib/views/widgets/StatefulWidget/DropdownButton/node1_base.dart +++ b/lib/views/widgets/StatefulWidget/DropdownButton/node1_base.dart @@ -6,7 +6,7 @@ import 'package:flutter/material.dart'; // { // "widgetId": 55, -// "name": 'DropdownButton基本语法', +// "name": 'DropdownButton基本用法', // "priority": 1, // "subtitle": // "【value】 : 当前值 【T】\n" diff --git a/lib/views/widgets/StatefulWidget/ExpansionTile/node1_base.dart b/lib/views/widgets/StatefulWidget/ExpansionTile/node1_base.dart index c9e6451..ea376b4 100644 --- a/lib/views/widgets/StatefulWidget/ExpansionTile/node1_base.dart +++ b/lib/views/widgets/StatefulWidget/ExpansionTile/node1_base.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; -import 'package:flutter_unit/views/widgets/exp/stateless_unit.dart'; - +import '../../StatelessWidget/RadioListTile/node1_base.dart'; +/// create by 张风捷特烈 on 2020/4/30 +/// contact me by email 1981462002@qq.com +/// 说明: // { // "widgetId": 52, // "name": 'ExpansionTile基本使用', diff --git a/lib/views/widgets/StatefulWidget/Hero/node1_base.dart b/lib/views/widgets/StatefulWidget/Hero/node1_base.dart index 1849a4e..b6c2e1b 100644 --- a/lib/views/widgets/StatefulWidget/Hero/node1_base.dart +++ b/lib/views/widgets/StatefulWidget/Hero/node1_base.dart @@ -6,7 +6,7 @@ import 'package:flutter/material.dart'; /// 说明: // { -// "widgetId": tag, +// "widgetId": 171, // "name": 'Hero基本使用', // "priority": 1, // "subtitle": diff --git a/lib/views/widgets/StatefulWidget/Image/node2_fit.dart b/lib/views/widgets/StatefulWidget/Image/node2_fit.dart index 31241d4..425d834 100644 --- a/lib/views/widgets/StatefulWidget/Image/node2_fit.dart +++ b/lib/views/widgets/StatefulWidget/Image/node2_fit.dart @@ -8,7 +8,7 @@ import 'package:flutter/material.dart'; // "name": '图片的适应模式', // "priority": 2, // "subtitle": -// "【fit】 : 适应模式*7 【BoxFit】\n" +// "【fit】 : 适应模式*7 【BoxFit】\n", // }, class FitImage extends StatefulWidget { diff --git a/lib/views/widgets/StatefulWidget/Image/node3_alignment.dart b/lib/views/widgets/StatefulWidget/Image/node3_alignment.dart index 8511d52..7ccf5f5 100644 --- a/lib/views/widgets/StatefulWidget/Image/node3_alignment.dart +++ b/lib/views/widgets/StatefulWidget/Image/node3_alignment.dart @@ -9,7 +9,7 @@ import 'package:flutter/material.dart'; // "priority": 3, // "subtitle": // "【alignment】 : 颜色 【AlignmentGeometry】\n" -// " 常用Alignment类的九个静态常量,但也可定制位置" +// " 常用Alignment类的九个静态常量,但也可定制位置", // }, class AlignmentImage extends StatelessWidget { diff --git a/lib/views/widgets/StatefulWidget/Image/node4_colorBlendMode.dart b/lib/views/widgets/StatefulWidget/Image/node4_colorBlendMode.dart index 4676df3..50a202b 100644 --- a/lib/views/widgets/StatefulWidget/Image/node4_colorBlendMode.dart +++ b/lib/views/widgets/StatefulWidget/Image/node4_colorBlendMode.dart @@ -9,7 +9,7 @@ import 'package:flutter/material.dart'; // "priority": 4, // "subtitle": // "【color】 : 颜色 【Color】\n" -// "【colorBlendMode】: 混合模式*29 【BlendMode】" +// "【colorBlendMode】: 混合模式*29 【BlendMode】", // }, class BlendModeImage extends StatelessWidget { diff --git a/lib/views/widgets/StatefulWidget/Image/node5_repeat.dart b/lib/views/widgets/StatefulWidget/Image/node5_repeat.dart index 383a26d..64eeffa 100644 --- a/lib/views/widgets/StatefulWidget/Image/node5_repeat.dart +++ b/lib/views/widgets/StatefulWidget/Image/node5_repeat.dart @@ -8,7 +8,7 @@ import 'package:flutter/material.dart'; // "name": '图片重复模式', // "priority": 5, // "subtitle": -// "【repeat】 : 重复模式*4 【ImageRepeat】" +// "【repeat】 : 重复模式*4 【ImageRepeat】", // }, class RepeatImage extends StatelessWidget { diff --git a/lib/views/widgets/StatefulWidget/Image/node6_centerSlice.dart b/lib/views/widgets/StatefulWidget/Image/node6_centerSlice.dart index ee65f00..4c7359d 100644 --- a/lib/views/widgets/StatefulWidget/Image/node6_centerSlice.dart +++ b/lib/views/widgets/StatefulWidget/Image/node6_centerSlice.dart @@ -11,7 +11,7 @@ import 'package:flutter/material.dart'; // "name": '图片实现局部放大', // "priority": 6, // "subtitle": -// "【centerSlice】 : 保留的区域 【Rect】" +// "【centerSlice】 : 保留的区域 【Rect】", // }, class CenterSliceImage extends StatelessWidget { diff --git a/lib/views/widgets/StatefulWidget/Ink/node2_image.dart b/lib/views/widgets/StatefulWidget/Ink/node2_image.dart index 2f9acea..ca82740 100644 --- a/lib/views/widgets/StatefulWidget/Ink/node2_image.dart +++ b/lib/views/widgets/StatefulWidget/Ink/node2_image.dart @@ -8,7 +8,7 @@ import 'package:flutter/material.dart'; // "name": 'Ink.image图片水波纹', // "priority": 2, // "subtitle": -// " 其中属性与Image组件一致,详见Image组件" +// " 其中属性与Image组件一致,详见Image组件", // } class InkImage extends StatelessWidget { diff --git a/lib/views/widgets/StatefulWidget/LinearProgressIndicator/node1_base.dart b/lib/views/widgets/StatefulWidget/LinearProgressIndicator/node1_base.dart index 6bc56f1..42cf95b 100644 --- a/lib/views/widgets/StatefulWidget/LinearProgressIndicator/node1_base.dart +++ b/lib/views/widgets/StatefulWidget/LinearProgressIndicator/node1_base.dart @@ -1,4 +1,7 @@ import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020/4/30 +/// contact me by email 1981462002@qq.com +/// 说明: // { // "widgetId": 47, // "name": 'LinearProgressIndicator基本使用', diff --git a/lib/views/widgets/StatefulWidget/MaterialApp/node1_base.dart b/lib/views/widgets/StatefulWidget/MaterialApp/node1_base.dart index 0f66d50..cfb7494 100644 --- a/lib/views/widgets/StatefulWidget/MaterialApp/node1_base.dart +++ b/lib/views/widgets/StatefulWidget/MaterialApp/node1_base.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:flutter_unit/app/router.dart'; -import 'package:flutter_unit/views/widgets/StatefulWidget/Scaffold/node1_base.dart'; +import '../../../../app/router.dart'; +import '../../StatefulWidget/Scaffold/node1_base.dart'; /// create by 张风捷特烈 on 2020-03-17 /// contact me by email 1981462002@qq.com @@ -14,7 +14,7 @@ import 'package:flutter_unit/views/widgets/StatefulWidget/Scaffold/node1_base.da // "【theme】 : 主题 【ThemeData】\n" // "【title】 : 任务栏标题 【String】\n" // "【onGenerateRoute】 : 路由生成器 【RouteFactory】\n" -// "【home】 : 主页 【Widget】" +// "【home】 : 主页 【Widget】", // } class CustomMaterialApp extends StatelessWidget { @override diff --git a/lib/views/widgets/StatefulWidget/PopupMenuButton/node1_base.dart b/lib/views/widgets/StatefulWidget/PopupMenuButton/node1_base.dart index 2680a34..e7e99db 100644 --- a/lib/views/widgets/StatefulWidget/PopupMenuButton/node1_base.dart +++ b/lib/views/widgets/StatefulWidget/PopupMenuButton/node1_base.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:flutter_unit/views/dialogs/dialog_about.dart'; +import '../../../dialogs/dialog_about.dart'; /// create by 张风捷特烈 on 2020-03-16 /// contact me by email 1981462002@qq.com diff --git a/lib/views/widgets/StatefulWidget/PopupMenuDivider/node1_base.dart b/lib/views/widgets/StatefulWidget/PopupMenuDivider/node1_base.dart index 44e9859..e657c5c 100644 --- a/lib/views/widgets/StatefulWidget/PopupMenuDivider/node1_base.dart +++ b/lib/views/widgets/StatefulWidget/PopupMenuDivider/node1_base.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:flutter_unit/views/dialogs/dialog_about.dart'; +import '../../../dialogs/dialog_about.dart'; /// create by 张风捷特烈 on 2020-03-29 /// contact me by email 1981462002@qq.com diff --git a/lib/views/widgets/StatefulWidget/PositionedTransition/node1_base.dart b/lib/views/widgets/StatefulWidget/PositionedTransition/node1_base.dart index 82eb148..aba0f6a 100644 --- a/lib/views/widgets/StatefulWidget/PositionedTransition/node1_base.dart +++ b/lib/views/widgets/StatefulWidget/PositionedTransition/node1_base.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; /// contact me by email 1981462002@qq.com /// 说明: // { -// "widgetId": 92, +// "widgetId": 93, // "name": 'PositionedTransition基本使用', // "priority": 1, // "subtitle": diff --git a/lib/views/widgets/StatefulWidget/RangeSlider/node1_base.dart b/lib/views/widgets/StatefulWidget/RangeSlider/node1_base.dart index 97bff14..9dacc40 100644 --- a/lib/views/widgets/StatefulWidget/RangeSlider/node1_base.dart +++ b/lib/views/widgets/StatefulWidget/RangeSlider/node1_base.dart @@ -4,7 +4,7 @@ import 'package:flutter/material.dart'; /// 说明: // { // "widgetId": 44, -// "name": 'Slider基本使用', +// "name": 'RangeSlider基本使用', // "priority": 1, // "subtitle": // "【values】 : 数值 【RangeValues】\n" diff --git a/lib/views/widgets/StatefulWidget/RawChip/node1_press.dart b/lib/views/widgets/StatefulWidget/RawChip/node1_press.dart index 48cc0df..45cdbbd 100644 --- a/lib/views/widgets/StatefulWidget/RawChip/node1_press.dart +++ b/lib/views/widgets/StatefulWidget/RawChip/node1_press.dart @@ -1,6 +1,5 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_unit/views/dialogs/dialog_about.dart'; /// create by 张风捷特烈 on 2020-03-26 /// contact me by email 1981462002@qq.com @@ -32,7 +31,7 @@ class PressRawChip extends StatelessWidget { elevation: 3, pressElevation: 5, shadowColor: Colors.orangeAccent, - onPressed: () => DialogAbout.show(context), + onPressed: () => Navigator.of(context).pushNamed('AboutMePage'), ), ); } diff --git a/lib/views/widgets/StatefulWidget/RawChip/node2_select.dart b/lib/views/widgets/StatefulWidget/RawChip/node2_select.dart index d143929..5427766 100644 --- a/lib/views/widgets/StatefulWidget/RawChip/node2_select.dart +++ b/lib/views/widgets/StatefulWidget/RawChip/node2_select.dart @@ -1,6 +1,5 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_unit/views/dialogs/dialog_about.dart'; /// create by 张风捷特烈 on 2020-03-26 /// contact me by email 1981462002@qq.com @@ -40,7 +39,7 @@ class _SelectRawChipState extends State { pressElevation: 5, shadowColor: Colors.orangeAccent, onSelected: (v)=> setState(() => _selected=v), - onDeleted: () => DialogAbout.show(context), + onDeleted: () => Navigator.of(context).pushNamed('AboutMePage'), ), ); } diff --git a/lib/views/widgets/StatefulWidget/RawMaterialButton/node1_base.dart b/lib/views/widgets/StatefulWidget/RawMaterialButton/node1_base.dart index 91dca57..f213fe8 100644 --- a/lib/views/widgets/StatefulWidget/RawMaterialButton/node1_base.dart +++ b/lib/views/widgets/StatefulWidget/RawMaterialButton/node1_base.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:flutter_unit/views/dialogs/dialog_about.dart'; + /// create by 张风捷特烈 on 2020-03-29 /// contact me by email 1981462002@qq.com diff --git a/lib/views/widgets/StatefulWidget/RawMaterialButton/node2_shape.dart b/lib/views/widgets/StatefulWidget/RawMaterialButton/node2_shape.dart index 8fb19a7..41a678a 100644 --- a/lib/views/widgets/StatefulWidget/RawMaterialButton/node2_shape.dart +++ b/lib/views/widgets/StatefulWidget/RawMaterialButton/node2_shape.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter_unit/views/dialogs/dialog_about.dart'; /// create by 张风捷特烈 on 2020-03-29 /// contact me by email 1981462002@qq.com diff --git a/lib/views/widgets/StatefulWidget/RefreshIndicator/node1_base.dart b/lib/views/widgets/StatefulWidget/RefreshIndicator/node1_base.dart index caaae62..a3c25c8 100644 --- a/lib/views/widgets/StatefulWidget/RefreshIndicator/node1_base.dart +++ b/lib/views/widgets/StatefulWidget/RefreshIndicator/node1_base.dart @@ -1,4 +1,7 @@ import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020/4/30 +/// contact me by email 1981462002@qq.com +/// 说明: // { // "widgetId": 49, // "name": 'RefreshIndicator基本使用', diff --git a/lib/views/widgets/StatefulWidget/RelativePositionedTransition/node1_base.dart b/lib/views/widgets/StatefulWidget/RelativePositionedTransition/node1_base.dart index 69814d7..8961c86 100644 --- a/lib/views/widgets/StatefulWidget/RelativePositionedTransition/node1_base.dart +++ b/lib/views/widgets/StatefulWidget/RelativePositionedTransition/node1_base.dart @@ -1,4 +1,7 @@ import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020/4/30 +/// contact me by email 1981462002@qq.com +/// 说明: // { // "widgetId": 115, diff --git a/lib/views/widgets/StatefulWidget/RotationTransition/node1_base.dart b/lib/views/widgets/StatefulWidget/RotationTransition/node1_base.dart index ef9e4bd..aa3fff9 100644 --- a/lib/views/widgets/StatefulWidget/RotationTransition/node1_base.dart +++ b/lib/views/widgets/StatefulWidget/RotationTransition/node1_base.dart @@ -1,5 +1,9 @@ import 'package:flutter/material.dart'; +/// create by 张风捷特烈 on 2020/4/30 +/// contact me by email 1981462002@qq.com +/// 说明: + // { // "widgetId": 90, // "name": 'RotationTransition基本使用', diff --git a/lib/views/widgets/StatefulWidget/Scaffold/node1_base.dart b/lib/views/widgets/StatefulWidget/Scaffold/node1_base.dart index bde5495..7228d42 100755 --- a/lib/views/widgets/StatefulWidget/Scaffold/node1_base.dart +++ b/lib/views/widgets/StatefulWidget/Scaffold/node1_base.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; -import 'package:flutter_unit/views/widgets/StatefulWidget/PopupMenuButton/node1_base.dart'; - +import '../PopupMenuButton/node1_base.dart'; +/// create by 张风捷特烈 on 2020/4/30 +/// contact me by email 1981462002@qq.com +/// 说明: // { // "widgetId": 64, // "name": 'Scaffold基本用法', diff --git a/lib/views/widgets/StatefulWidget/ScaleTransition/node1_base.dart b/lib/views/widgets/StatefulWidget/ScaleTransition/node1_base.dart index ecc02f0..1fe7372 100644 --- a/lib/views/widgets/StatefulWidget/ScaleTransition/node1_base.dart +++ b/lib/views/widgets/StatefulWidget/ScaleTransition/node1_base.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; - +/// create by 张风捷特烈 on 2020/4/30 +/// contact me by email 1981462002@qq.com +/// 说明: // { // "widgetId": 91, // "name": 'ScaleTransition基本使用', diff --git a/lib/views/widgets/StatefulWidget/SelectableText/node1_base.dart b/lib/views/widgets/StatefulWidget/SelectableText/node1_base.dart index fd26b31..354dca8 100644 --- a/lib/views/widgets/StatefulWidget/SelectableText/node1_base.dart +++ b/lib/views/widgets/StatefulWidget/SelectableText/node1_base.dart @@ -13,7 +13,7 @@ import 'package:flutter/material.dart'; // "【cursorColor】 : 光标颜色 【Color】\n" // "【cursorWidth】 : 光标宽度 【double】\n" // "【showCursor】 : 是否显示光标 【bool】\n" -// "【autofocus】 : 自动聚焦 【bool】" +// "【autofocus】 : 自动聚焦 【bool】", // } class CustomSelectableText extends StatelessWidget { final text = " 始臣之解牛之时,所见无非牛者。三年之后,未尝见全牛也。方今之时," diff --git a/lib/views/widgets/StatefulWidget/SizeTransition/node1_base.dart b/lib/views/widgets/StatefulWidget/SizeTransition/node1_base.dart index ead3be6..1a9724d 100644 --- a/lib/views/widgets/StatefulWidget/SizeTransition/node1_base.dart +++ b/lib/views/widgets/StatefulWidget/SizeTransition/node1_base.dart @@ -5,7 +5,7 @@ import 'package:flutter/material.dart'; /// 说明: // { // "widgetId": 92, -// "name": 'FadeTransition基本使用', +// "name": 'SizeTransition基本使用', // "priority": 1, // "subtitle": // "【child】 : 孩子组件 【Widget】\n" diff --git a/lib/views/widgets/StatefulWidget/SlideTransition/node1_base.dart b/lib/views/widgets/StatefulWidget/SlideTransition/node1_base.dart index b7d9a6b..f51e92e 100644 --- a/lib/views/widgets/StatefulWidget/SlideTransition/node1_base.dart +++ b/lib/views/widgets/StatefulWidget/SlideTransition/node1_base.dart @@ -1,6 +1,8 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; - +/// create by 张风捷特烈 on 2020/4/30 +/// contact me by email 1981462002@qq.com +/// 说明: // { // "widgetId": 112, // "name": 'SlideTransition基本使用', diff --git a/lib/views/widgets/StatefulWidget/Switch/node1_base.dart b/lib/views/widgets/StatefulWidget/Switch/node1_base.dart index c5df7cb..1fc7cbc 100644 --- a/lib/views/widgets/StatefulWidget/Switch/node1_base.dart +++ b/lib/views/widgets/StatefulWidget/Switch/node1_base.dart @@ -6,7 +6,7 @@ import 'package:flutter/material.dart'; /// { // "widgetId": 40, -// "name": 'Switch基础语法', +// "name": 'Switch基础用法', // "priority": 1, // "subtitle": // "【inactiveThumbColor】 : 未选中小圈颜色 【Color】\n" diff --git a/lib/views/widgets/StatefulWidget/Switch/node2_image.dart b/lib/views/widgets/StatefulWidget/Switch/node2_image.dart index 4edd18f..bd73408 100644 --- a/lib/views/widgets/StatefulWidget/Switch/node2_image.dart +++ b/lib/views/widgets/StatefulWidget/Switch/node2_image.dart @@ -10,7 +10,7 @@ import 'package:flutter/material.dart'; // "priority": 2, // "subtitle": // "【inactiveThumbImage】 : 未选中小圈图片 【ImageProvider】\n" -// "【activeThumbImage】 : 选中时滑槽颜色 【ImageProvider】" +// "【activeThumbImage】 : 选中时滑槽颜色 【ImageProvider】", // } class ImageSwitch extends StatefulWidget { @override diff --git a/lib/views/widgets/StatefulWidget/TabBarView/node1_base.dart b/lib/views/widgets/StatefulWidget/TabBarView/node1_base.dart index 6feb48a..a47bbdb 100644 --- a/lib/views/widgets/StatefulWidget/TabBarView/node1_base.dart +++ b/lib/views/widgets/StatefulWidget/TabBarView/node1_base.dart @@ -9,7 +9,7 @@ import 'package:flutter/material.dart'; // "subtitle": // "【controller】 : 控制器 【TabController】\n" // "【children】 : 孩子们 【指示器颜色】\n" -// "【physics】 : 表现 【ScrollPhysics】" +// "【physics】 : 表现 【ScrollPhysics】", // } class CustomTabBarView extends StatefulWidget { @override diff --git a/lib/views/widgets/StatefulWidget/TextField/node1_base.dart b/lib/views/widgets/StatefulWidget/TextField/node1_base.dart index 3d765f5..9c8bcf4 100644 --- a/lib/views/widgets/StatefulWidget/TextField/node1_base.dart +++ b/lib/views/widgets/StatefulWidget/TextField/node1_base.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; - +/// create by 张风捷特烈 on 2020/4/30 +/// contact me by email 1981462002@qq.com +/// 说明: // { // "widgetId": 54, // "name": 'TextField基本用法', diff --git a/lib/views/widgets/StatefulWidget/Tooltip/node1_base.dart b/lib/views/widgets/StatefulWidget/Tooltip/node1_base.dart index b0482a7..7b37676 100644 --- a/lib/views/widgets/StatefulWidget/Tooltip/node1_base.dart +++ b/lib/views/widgets/StatefulWidget/Tooltip/node1_base.dart @@ -13,7 +13,7 @@ import 'package:flutter/material.dart'; // "【message】 : 消息内容 【String】\n" // "【showDuration】 : 展示时间 【Duration】\n" // "【waitDuration】 : 悬浮出现时间 【Duration】\n" -// "【child】 : 孩子 【Widget】" +// "【child】 : 孩子 【Widget】", // } class CustomTooltip extends StatelessWidget { @override diff --git a/lib/views/widgets/StatefulWidget/Tooltip/node2_decoration.dart b/lib/views/widgets/StatefulWidget/Tooltip/node2_decoration.dart index fbc4832..861890e 100644 --- a/lib/views/widgets/StatefulWidget/Tooltip/node2_decoration.dart +++ b/lib/views/widgets/StatefulWidget/Tooltip/node2_decoration.dart @@ -9,7 +9,7 @@ import 'package:flutter/material.dart'; // "priority": 2, // "subtitle": // "【decoration】 : 装饰对象 【Decoration】\n" -// "【textStyle】 : 文字样式 【double】" +// "【textStyle】 : 文字样式 【double】", // } class DecorationTooltip extends StatelessWidget { @override diff --git a/lib/views/widgets/StatelessWidget/ActionChip/node1_base.dart b/lib/views/widgets/StatelessWidget/ActionChip/node1_base.dart index e556771..0100d90 100644 --- a/lib/views/widgets/StatelessWidget/ActionChip/node1_base.dart +++ b/lib/views/widgets/StatelessWidget/ActionChip/node1_base.dart @@ -15,7 +15,7 @@ import 'package:flutter/material.dart'; -import 'package:flutter_unit/views/dialogs/dialog_about.dart'; +import '../../../dialogs/dialog_about.dart'; class CustomActionChip extends StatelessWidget { diff --git a/lib/views/widgets/StatelessWidget/Banner/node1_base.dart b/lib/views/widgets/StatelessWidget/Banner/node1_base.dart index 32cb29c..4b7e3a0 100644 --- a/lib/views/widgets/StatelessWidget/Banner/node1_base.dart +++ b/lib/views/widgets/StatelessWidget/Banner/node1_base.dart @@ -1,4 +1,6 @@ - +/// create by 张风捷特烈 on 2020/4/30 +/// contact me by email 1981462002@qq.com +/// 说明: // { // "widgetId": 5, // "priority": 1, diff --git a/lib/views/widgets/StatelessWidget/ButtonBar/node1_base.dart b/lib/views/widgets/StatelessWidget/ButtonBar/node1_base.dart index 89db637..c469d3f 100755 --- a/lib/views/widgets/StatelessWidget/ButtonBar/node1_base.dart +++ b/lib/views/widgets/StatelessWidget/ButtonBar/node1_base.dart @@ -10,7 +10,7 @@ // } import 'package:flutter/material.dart'; -import 'package:flutter_unit/views/dialogs/dialog_about.dart'; +import '../../../dialogs/dialog_about.dart'; class CustomButtonBar extends StatelessWidget { @@ -36,27 +36,3 @@ class CustomButtonBar extends StatelessWidget { } } -class PaddingButtonBar extends StatelessWidget { - @override - Widget build(BuildContext context) { - return ButtonBar( - alignment: MainAxisAlignment.center, - buttonHeight: 40, - buttonPadding: EdgeInsets.only(left: 15,right: 15), - children: [ - RaisedButton( - color: Colors.blue, - child: Text("Raised"), - onPressed: () => DialogAbout.show(context)), - OutlineButton( - child: Text("Outline"), - onPressed: () => DialogAbout.show(context)), - FlatButton( - color: Colors.blue, - onPressed: () => DialogAbout.show(context), - child: Text("Flat"), - ) - ], - ); - } -} diff --git a/lib/views/widgets/StatelessWidget/ButtonBar/node2_padding.dart b/lib/views/widgets/StatelessWidget/ButtonBar/node2_padding.dart new file mode 100644 index 0000000..0f58bc6 --- /dev/null +++ b/lib/views/widgets/StatelessWidget/ButtonBar/node2_padding.dart @@ -0,0 +1,38 @@ + +import 'package:flutter/material.dart'; +import '../../../dialogs/dialog_about.dart'; + +/// create by 张风捷特烈 on 2020-03-25 +/// contact me by email 1981462002@qq.com +/// 说明: +// { +// "widgetId": 29, +// "priority": 2, +// "name": "ButtonBar边距和高", +// "subtitle": "【buttonPadding】: 内边距 【EdgeInsetsGeometry】\n" +// "【buttonHeight】: 高 【double】", +// } +class PaddingButtonBar extends StatelessWidget { + @override + Widget build(BuildContext context) { + return ButtonBar( + alignment: MainAxisAlignment.center, + buttonHeight: 40, + buttonPadding: EdgeInsets.only(left: 15,right: 15), + children: [ + RaisedButton( + color: Colors.blue, + child: Text("Raised"), + onPressed: () => DialogAbout.show(context)), + OutlineButton( + child: Text("Outline"), + onPressed: () => DialogAbout.show(context)), + FlatButton( + color: Colors.blue, + onPressed: () => DialogAbout.show(context), + child: Text("Flat"), + ) + ], + ); + } +} diff --git a/lib/views/widgets/StatelessWidget/Card/node2_shape.dart b/lib/views/widgets/StatelessWidget/Card/node2_shape.dart index 40b5e83..3f5f622 100644 --- a/lib/views/widgets/StatelessWidget/Card/node2_shape.dart +++ b/lib/views/widgets/StatelessWidget/Card/node2_shape.dart @@ -14,7 +14,7 @@ // } import 'package:flutter/material.dart'; -import 'package:flutter_unit/app/utils/pather.dart'; +import '../../../../app/utils/pather.dart'; class ShapeCard extends StatelessWidget { @override diff --git a/lib/views/widgets/StatelessWidget/Chip/node3_delete.dart b/lib/views/widgets/StatelessWidget/Chip/node3_delete.dart index bf31064..910d936 100644 --- a/lib/views/widgets/StatelessWidget/Chip/node3_delete.dart +++ b/lib/views/widgets/StatelessWidget/Chip/node3_delete.dart @@ -13,7 +13,7 @@ // "【onDeleted】: 右侧组件点击事件 【Function】", // } import 'package:flutter/material.dart'; -import 'package:flutter_unit/views/dialogs/dialog_about.dart'; +import '../../../dialogs/dialog_about.dart'; class DeleteOfChip extends StatelessWidget { @override diff --git a/lib/views/widgets/StatelessWidget/CupertinoActionSheetAction/node1_base.dart b/lib/views/widgets/StatelessWidget/CupertinoActionSheetAction/node1_base.dart index d720ad1..b38d8d1 100644 --- a/lib/views/widgets/StatelessWidget/CupertinoActionSheetAction/node1_base.dart +++ b/lib/views/widgets/StatelessWidget/CupertinoActionSheetAction/node1_base.dart @@ -3,7 +3,7 @@ /// 说明: // { // "widgetId": 132, -// "name": 'CupertinoActionSheet基本使用', +// "name": 'CupertinoActionSheetAction基本使用', // "priority": 1, // "subtitle": // "【child】 : 子组件 【Widget】\n" @@ -13,7 +13,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_unit/views/dialogs/dialog_about.dart'; +import '../../../dialogs/dialog_about.dart'; class CustomCupertinoActionSheetAction extends StatelessWidget { @override diff --git a/lib/views/widgets/StatelessWidget/CupertinoDialogAction/node1_base.dart b/lib/views/widgets/StatelessWidget/CupertinoDialogAction/no_node1_base.dart similarity index 100% rename from lib/views/widgets/StatelessWidget/CupertinoDialogAction/node1_base.dart rename to lib/views/widgets/StatelessWidget/CupertinoDialogAction/no_node1_base.dart diff --git a/lib/views/widgets/StatelessWidget/FloatingActionButton/node3_shape.dart b/lib/views/widgets/StatelessWidget/FloatingActionButton/node3_shape.dart index d1c50e1..9b5551c 100644 --- a/lib/views/widgets/StatelessWidget/FloatingActionButton/node3_shape.dart +++ b/lib/views/widgets/StatelessWidget/FloatingActionButton/node3_shape.dart @@ -13,7 +13,7 @@ import 'dart:math'; import 'package:flutter/material.dart'; -import 'package:flutter_unit/app/utils/pather.dart'; +import '../../../../app/utils/pather.dart'; class ShapeFAB extends StatelessWidget { @override diff --git a/lib/views/widgets/StatelessWidget/Icon/node2_diy.dart b/lib/views/widgets/StatelessWidget/Icon/node2_diy.dart index 1a3784d..8651fea 100644 --- a/lib/views/widgets/StatelessWidget/Icon/node2_diy.dart +++ b/lib/views/widgets/StatelessWidget/Icon/node2_diy.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:flutter_unit/app/style/TolyIcon.dart'; +import '../../../../app/style/TolyIcon.dart'; /// create by 张风捷特烈 on 2020/4/27 /// contact me by email 1981462002@qq.com diff --git a/lib/views/widgets/StatelessWidget/InputChip/node1_base.dart b/lib/views/widgets/StatelessWidget/InputChip/node1_base.dart index 7190ee8..3b80bda 100644 --- a/lib/views/widgets/StatelessWidget/InputChip/node1_base.dart +++ b/lib/views/widgets/StatelessWidget/InputChip/node1_base.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter_unit/views/dialogs/dialog_about.dart'; /// create by 张风捷特烈 on 2020/4/27 /// contact me by email 1981462002@qq.com @@ -35,7 +34,7 @@ class _PressInputChipState extends State { selectedShadowColor: Colors.blue, shadowColor: Colors.orangeAccent, elevation: 3, - onPressed: () => DialogAbout.show(context), + onPressed: () => Navigator.of(context).pushNamed('AboutMePage'), onDeleted: () => setState(() => _delete = !_delete)); } } \ No newline at end of file diff --git a/lib/views/widgets/StatelessWidget/InputChip/node2_select.dart b/lib/views/widgets/StatelessWidget/InputChip/node2_select.dart index 1eb5959..64b33fd 100644 --- a/lib/views/widgets/StatelessWidget/InputChip/node2_select.dart +++ b/lib/views/widgets/StatelessWidget/InputChip/node2_select.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter_unit/views/dialogs/dialog_about.dart'; @@ -35,7 +34,7 @@ class _SelectInputChipState extends State { selectedShadowColor: Colors.blue, shadowColor: Colors.orangeAccent, elevation: 3, - onDeleted: () => DialogAbout.show(context), + onDeleted: () => Navigator.of(context).pushNamed('AboutMePage'), onSelected: (bool value) { setState(() { _select = value; diff --git a/lib/views/widgets/StatelessWidget/ListTile/node1_base.dart b/lib/views/widgets/StatelessWidget/ListTile/node1_base.dart index 3d31f34..01c41b3 100644 --- a/lib/views/widgets/StatelessWidget/ListTile/node1_base.dart +++ b/lib/views/widgets/StatelessWidget/ListTile/node1_base.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter_unit/views/dialogs/dialog_about.dart'; /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com @@ -28,7 +27,7 @@ class CustomListTile extends StatelessWidget { subtitle: Text("海子"), contentPadding: EdgeInsets.all(5), trailing: Icon(Icons.more_vert), - onLongPress: () => DialogAbout.show(context), + onLongPress: () => Navigator.of(context).pushNamed('AboutMePage'), ), ); } diff --git a/lib/views/widgets/StatelessWidget/MaterialButton/node1_base.dart b/lib/views/widgets/StatelessWidget/MaterialButton/node1_base.dart index d73a363..9e3c20e 100644 --- a/lib/views/widgets/StatelessWidget/MaterialButton/node1_base.dart +++ b/lib/views/widgets/StatelessWidget/MaterialButton/node1_base.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter_unit/views/dialogs/dialog_about.dart'; /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com @@ -31,6 +30,6 @@ class CustomMaterialButton extends StatelessWidget { splashColor: Colors.blue, padding: EdgeInsets.all(8), child: Text("MaterialButton"), - onPressed: () => DialogAbout.show(context)); + onPressed: () => Navigator.of(context).pushNamed('AboutMePage')); } } \ No newline at end of file diff --git a/lib/views/widgets/StatelessWidget/MaterialButton/node2_onLongPress.dart b/lib/views/widgets/StatelessWidget/MaterialButton/node2_onLongPress.dart index 8ec33ad..b033435 100644 --- a/lib/views/widgets/StatelessWidget/MaterialButton/node2_onLongPress.dart +++ b/lib/views/widgets/StatelessWidget/MaterialButton/node2_onLongPress.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter_unit/views/dialogs/dialog_about.dart'; /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com @@ -24,7 +23,7 @@ class LongPressMaterialButton extends StatelessWidget { textColor: Colors.white, padding: EdgeInsets.all(8), child: Text("MaterialButton"), - onLongPress: () => DialogAbout.show(context), - onPressed: () => DialogAbout.show(context)); + onLongPress: () => Navigator.of(context).pushNamed('AboutMePage'), + onPressed: () => Navigator.of(context).pushNamed('AboutMePage')); } } \ No newline at end of file diff --git a/lib/views/widgets/StatelessWidget/MaterialButton/node3_shape.dart b/lib/views/widgets/StatelessWidget/MaterialButton/node3_shape.dart index 97a7335..6a1dada 100644 --- a/lib/views/widgets/StatelessWidget/MaterialButton/node3_shape.dart +++ b/lib/views/widgets/StatelessWidget/MaterialButton/node3_shape.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter_unit/views/dialogs/dialog_about.dart'; /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com @@ -35,8 +34,8 @@ class ShapeMaterialButton extends StatelessWidget { shape: CircleBorder( side: BorderSide(width: 2.0, color: Color(0xFFFFDFDFDF)), ), - onLongPress: () => DialogAbout.show(context), - onPressed: () => DialogAbout.show(context)), + onLongPress: () => Navigator.of(context).pushNamed('AboutMePage'), + onPressed: () => Navigator.of(context).pushNamed('AboutMePage')), ), Container( width: 100, @@ -54,8 +53,8 @@ class ShapeMaterialButton extends StatelessWidget { ), shape: RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(15))), - onLongPress: () => DialogAbout.show(context), - onPressed: () => DialogAbout.show(context)), + onLongPress: () => Navigator.of(context).pushNamed('AboutMePage'), + onPressed: () => Navigator.of(context).pushNamed('AboutMePage')), ), ], ); diff --git a/lib/views/widgets/StatelessWidget/PreferredSize/node1_base.dart b/lib/views/widgets/StatelessWidget/PreferredSize/node1_base.dart new file mode 100644 index 0000000..7b52570 --- /dev/null +++ b/lib/views/widgets/StatelessWidget/PreferredSize/node1_base.dart @@ -0,0 +1,27 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/5/3 +/// contact me by email 1981462002@qq.com +/// 说明: +// { +// "widgetId": 204, +// "name": 'PreferredSize调整AppBar高度', +// "priority": 1, +// "subtitle": "【preferredSize】 : 尺寸 【Size】", +// } +class CustomPreferredSize extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Container( + height: 200, + child: Scaffold( + appBar: PreferredSize( + preferredSize: Size.fromHeight(150), + child: AppBar( + title: Text('PreferredSize'), + ), + ), + ), + ); + } +} diff --git a/lib/views/widgets/StatelessWidget/PreferredSize/node2_adapter.dart b/lib/views/widgets/StatelessWidget/PreferredSize/node2_adapter.dart new file mode 100644 index 0000000..60cee0a --- /dev/null +++ b/lib/views/widgets/StatelessWidget/PreferredSize/node2_adapter.dart @@ -0,0 +1,34 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/5/3 +/// contact me by email 1981462002@qq.com +/// 说明: +// { +// "widgetId": 204, +// "name": 'PreferredSize的转化使用', +// "priority": 2, +// "subtitle": "【PreferredSize将普通组件转化为PreferredSizeWidget", +// } +class AdapterPreferredSize extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Container( + height: 200, + child: Scaffold( + appBar: PreferredSize( + preferredSize: Size.fromHeight(150), + child: AppBar( + title: Text('PreferredSize'), + bottom: PreferredSize( + preferredSize: Size.fromHeight(40), + child: Container( + height: 40, + color: Colors.orange, + ), + ), + ), + ), + ), + ); + } +} diff --git a/lib/views/widgets/StatelessWidget/SimpleDialogOption/node1_base.dart b/lib/views/widgets/StatelessWidget/SimpleDialogOption/node1_base.dart index 8b1654e..321f27c 100644 --- a/lib/views/widgets/StatelessWidget/SimpleDialogOption/node1_base.dart +++ b/lib/views/widgets/StatelessWidget/SimpleDialogOption/node1_base.dart @@ -1,6 +1,4 @@ -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_unit/views/dialogs/dialog_about.dart'; /// create by 张风捷特烈 on 2020-03-25 /// contact me by email 1981462002@qq.com @@ -25,7 +23,7 @@ class CustomSimpleDialogOption extends StatelessWidget { margin: EdgeInsets.all(5), color: Colors.grey.withAlpha(33), child: SimpleDialogOption( - onPressed: () => DialogAbout.show(context), + onPressed: () => Navigator.of(context).pushNamed('AboutMePage'), child: Text('张风捷特烈')), ), Container( @@ -35,7 +33,7 @@ class CustomSimpleDialogOption extends StatelessWidget { color: Colors.grey.withAlpha(33), margin: EdgeInsets.all(5), child: SimpleDialogOption( - onPressed: () => DialogAbout.show(context), + onPressed: () => Navigator.of(context).pushNamed('AboutMePage'), child: Text('百里·巫缨')), ), ], diff --git a/lib/views/widgets/StatelessWidget/TabBar/no_shadow_tab_bar.dart b/lib/views/widgets/StatelessWidget/TabBar/no_shadow_tab_bar.dart new file mode 100644 index 0000000..a1ae1ae --- /dev/null +++ b/lib/views/widgets/StatelessWidget/TabBar/no_shadow_tab_bar.dart @@ -0,0 +1,1345 @@ +/// create by 张风捷特烈 on 2020-03-16 +/// contact me by email 1981462002@qq.com +/// 说明: + +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:async'; +import 'dart:ui' show lerpDouble; + +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter/gestures.dart' show DragStartBehavior; + + +const double _kTabHeight = 46.0; +const double _kTextAndIconTabHeight = 72.0; + +/// Defines how the bounds of the selected tab indicator are computed. +/// +/// See also: +/// +/// * [TabBar], which displays a row of tabs. +/// * [TabBarView], which displays a widget for the currently selected tab. +/// * [TabBar.indicator], which defines the appearance of the selected tab +/// indicator relative to the tab's bounds. +enum TabBarIndicatorSize { + /// The tab indicator's bounds are as wide as the space occupied by the tab + /// in the tab bar: from the right edge of the previous tab to the left edge + /// of the next tab. + tab, + + /// The tab's bounds are only as wide as the (centered) tab widget itself. + /// + /// This value is used to align the tab's label, typically a [Tab] + /// widget's text or icon, with the selected tab indicator. + label, +} + +class _TabStyle extends AnimatedWidget { + const _TabStyle({ + Key key, + Animation animation, + this.selected, + this.labelColor, + this.unselectedLabelColor, + this.labelStyle, + this.unselectedLabelStyle, + @required this.child, + }) : super(key: key, listenable: animation); + + final TextStyle labelStyle; + final TextStyle unselectedLabelStyle; + final bool selected; + final Color labelColor; + final Color unselectedLabelColor; + final Widget child; + + @override + Widget build(BuildContext context) { + final ThemeData themeData = Theme.of(context); + final TabBarTheme tabBarTheme = TabBarTheme.of(context); + final Animation animation = listenable; + + // To enable TextStyle.lerp(style1, style2, value), both styles must have + // the same value of inherit. Force that to be inherit=true here. + final TextStyle defaultStyle = (labelStyle + ?? tabBarTheme.labelStyle + ?? themeData.primaryTextTheme.body2 + ).copyWith(inherit: true); + final TextStyle defaultUnselectedStyle = (unselectedLabelStyle + ?? tabBarTheme.unselectedLabelStyle + ?? labelStyle + ?? themeData.primaryTextTheme.body2 + ).copyWith(inherit: true); + final TextStyle textStyle = selected + ? TextStyle.lerp(defaultStyle, defaultUnselectedStyle, animation.value) + : TextStyle.lerp(defaultUnselectedStyle, defaultStyle, animation.value); + + final Color selectedColor = labelColor + ?? tabBarTheme.labelColor + ?? themeData.primaryTextTheme.body2.color; + final Color unselectedColor = unselectedLabelColor + ?? tabBarTheme.unselectedLabelColor + ?? selectedColor.withAlpha(0xB2); // 70% alpha + final Color color = selected + ? Color.lerp(selectedColor, unselectedColor, animation.value) + : Color.lerp(unselectedColor, selectedColor, animation.value); + + return DefaultTextStyle( + style: textStyle.copyWith(color: color), + child: IconTheme.merge( + data: IconThemeData( + size: 24.0, + color: color, + ), + child: child, + ), + ); + } +} + +typedef _LayoutCallback = void Function(List xOffsets, TextDirection textDirection, double width); + +class _TabLabelBarRenderer extends RenderFlex { + _TabLabelBarRenderer({ + List children, + @required Axis direction, + @required MainAxisSize mainAxisSize, + @required MainAxisAlignment mainAxisAlignment, + @required CrossAxisAlignment crossAxisAlignment, + @required TextDirection textDirection, + @required VerticalDirection verticalDirection, + @required this.onPerformLayout, + }) : assert(onPerformLayout != null), + assert(textDirection != null), + super( + children: children, + direction: direction, + mainAxisSize: mainAxisSize, + mainAxisAlignment: mainAxisAlignment, + crossAxisAlignment: crossAxisAlignment, + textDirection: textDirection, + verticalDirection: verticalDirection, + ); + + _LayoutCallback onPerformLayout; + + @override + void performLayout() { + super.performLayout(); + // xOffsets will contain childCount+1 values, giving the offsets of the + // leading edge of the first tab as the first value, of the leading edge of + // the each subsequent tab as each subsequent value, and of the trailing + // edge of the last tab as the last value. + RenderBox child = firstChild; + final List xOffsets = []; + while (child != null) { + final FlexParentData childParentData = child.parentData; + xOffsets.add(childParentData.offset.dx); + assert(child.parentData == childParentData); + child = childParentData.nextSibling; + } + assert(textDirection != null); + switch (textDirection) { + case TextDirection.rtl: + xOffsets.insert(0, size.width); + break; + case TextDirection.ltr: + xOffsets.add(size.width); + break; + } + onPerformLayout(xOffsets, textDirection, size.width); + } +} + +// This class and its renderer class only exist to report the widths of the tabs +// upon layout. The tab widths are only used at paint time (see _IndicatorPainter) +// or in response to input. +class _TabLabelBar extends Flex { + _TabLabelBar({ + Key key, + List children = const [], + this.onPerformLayout, + }) : super( + key: key, + children: children, + direction: Axis.horizontal, + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + verticalDirection: VerticalDirection.down, + ); + + final _LayoutCallback onPerformLayout; + + @override + RenderFlex createRenderObject(BuildContext context) { + return _TabLabelBarRenderer( + direction: direction, + mainAxisAlignment: mainAxisAlignment, + mainAxisSize: mainAxisSize, + crossAxisAlignment: crossAxisAlignment, + textDirection: getEffectiveTextDirection(context), + verticalDirection: verticalDirection, + onPerformLayout: onPerformLayout, + ); + } + + @override + void updateRenderObject(BuildContext context, _TabLabelBarRenderer renderObject) { + super.updateRenderObject(context, renderObject); + renderObject.onPerformLayout = onPerformLayout; + } +} + +double _indexChangeProgress(TabController controller) { + final double controllerValue = controller.animation.value; + final double previousIndex = controller.previousIndex.toDouble(); + final double currentIndex = controller.index.toDouble(); + + // The controller's offset is changing because the user is dragging the + // TabBarView's PageView to the left or right. + if (!controller.indexIsChanging) + return (currentIndex - controllerValue).abs().clamp(0.0, 1.0); + + // The TabController animation's value is changing from previousIndex to currentIndex. + return (controllerValue - currentIndex).abs() / (currentIndex - previousIndex).abs(); +} + +class _IndicatorPainter extends CustomPainter { + _IndicatorPainter({ + @required this.controller, + @required this.indicator, + @required this.indicatorSize, + @required this.tabKeys, + _IndicatorPainter old, + }) : assert(controller != null), + assert(indicator != null), + super(repaint: controller.animation) { + if (old != null) + saveTabOffsets(old._currentTabOffsets, old._currentTextDirection); + } + + final TabController controller; + final Decoration indicator; + final TabBarIndicatorSize indicatorSize; + final List tabKeys; + + List _currentTabOffsets; + TextDirection _currentTextDirection; + Rect _currentRect; + BoxPainter _painter; + bool _needsPaint = false; + void markNeedsPaint() { + _needsPaint = true; + } + + void dispose() { + _painter?.dispose(); + } + + void saveTabOffsets(List tabOffsets, TextDirection textDirection) { + _currentTabOffsets = tabOffsets; + _currentTextDirection = textDirection; + } + + // _currentTabOffsets[index] is the offset of the start edge of the tab at index, and + // _currentTabOffsets[_currentTabOffsets.length] is the end edge of the last tab. + int get maxTabIndex => _currentTabOffsets.length - 2; + + double centerOf(int tabIndex) { + assert(_currentTabOffsets != null); + assert(_currentTabOffsets.isNotEmpty); + assert(tabIndex >= 0); + assert(tabIndex <= maxTabIndex); + return (_currentTabOffsets[tabIndex] + _currentTabOffsets[tabIndex + 1]) / 2.0; + } + + Rect indicatorRect(Size tabBarSize, int tabIndex) { + assert(_currentTabOffsets != null); + assert(_currentTextDirection != null); + assert(_currentTabOffsets.isNotEmpty); + assert(tabIndex >= 0); + assert(tabIndex <= maxTabIndex); + double tabLeft, tabRight; + switch (_currentTextDirection) { + case TextDirection.rtl: + tabLeft = _currentTabOffsets[tabIndex + 1]; + tabRight = _currentTabOffsets[tabIndex]; + break; + case TextDirection.ltr: + tabLeft = _currentTabOffsets[tabIndex]; + tabRight = _currentTabOffsets[tabIndex + 1]; + break; + } + + if (indicatorSize == TabBarIndicatorSize.label) { + final double tabWidth = tabKeys[tabIndex].currentContext.size.width; + final double delta = ((tabRight - tabLeft) - tabWidth) / 2.0; + tabLeft += delta; + tabRight -= delta; + } + + return Rect.fromLTWH(tabLeft, 0.0, tabRight - tabLeft, tabBarSize.height); + } + + @override + void paint(Canvas canvas, Size size) { + _needsPaint = false; + _painter ??= indicator.createBoxPainter(markNeedsPaint); + + if (controller.indexIsChanging) { + // The user tapped on a tab, the tab controller's animation is running. + final Rect targetRect = indicatorRect(size, controller.index); + _currentRect = Rect.lerp(targetRect, _currentRect ?? targetRect, _indexChangeProgress(controller)); + } else { + // The user is dragging the TabBarView's PageView left or right. + final int currentIndex = controller.index; + final Rect previous = currentIndex > 0 ? indicatorRect(size, currentIndex - 1) : null; + final Rect middle = indicatorRect(size, currentIndex); + final Rect next = currentIndex < maxTabIndex ? indicatorRect(size, currentIndex + 1) : null; + final double index = controller.index.toDouble(); + final double value = controller.animation.value; + if (value == index - 1.0) + _currentRect = previous ?? middle; + else if (value == index + 1.0) + _currentRect = next ?? middle; + else if (value == index) + _currentRect = middle; + else if (value < index) + _currentRect = previous == null ? middle : Rect.lerp(middle, previous, index - value); + else + _currentRect = next == null ? middle : Rect.lerp(middle, next, value - index); + } + assert(_currentRect != null); + + final ImageConfiguration configuration = ImageConfiguration( + size: _currentRect.size, + textDirection: _currentTextDirection, + ); + _painter.paint(canvas, _currentRect.topLeft, configuration); + } + + static bool _tabOffsetsEqual(List a, List b) { + // TODO(shihaohong): The following null check should be replaced when a fix + // for https://github.com/flutter/flutter/issues/40014 is available. + if (a == null || b == null || a.length != b.length) + return false; + for (int i = 0; i < a.length; i += 1) { + if (a[i] != b[i]) + return false; + } + return true; + } + + @override + bool shouldRepaint(_IndicatorPainter old) { + return _needsPaint + || controller != old.controller + || indicator != old.indicator + || tabKeys.length != old.tabKeys.length + || (!_tabOffsetsEqual(_currentTabOffsets, old._currentTabOffsets)) + || _currentTextDirection != old._currentTextDirection; + } +} + +class _ChangeAnimation extends Animation with AnimationWithParentMixin { + _ChangeAnimation(this.controller); + + final TabController controller; + + @override + Animation get parent => controller.animation; + + @override + void removeStatusListener(AnimationStatusListener listener) { + if (parent != null) + super.removeStatusListener(listener); + } + + @override + void removeListener(VoidCallback listener) { + if (parent != null) + super.removeListener(listener); + } + + @override + double get value => _indexChangeProgress(controller); +} + +class _DragAnimation extends Animation with AnimationWithParentMixin { + _DragAnimation(this.controller, this.index); + + final TabController controller; + final int index; + + @override + Animation get parent => controller.animation; + + @override + void removeStatusListener(AnimationStatusListener listener) { + if (parent != null) + super.removeStatusListener(listener); + } + + @override + void removeListener(VoidCallback listener) { + if (parent != null) + super.removeListener(listener); + } + + @override + double get value { + assert(!controller.indexIsChanging); + return (controller.animation.value - index.toDouble()).abs().clamp(0.0, 1.0); + } +} + +// This class, and TabBarScrollController, only exist to handle the case +// where a scrollable TabBar has a non-zero initialIndex. In that case we can +// only compute the scroll position's initial scroll offset (the "correct" +// pixels value) after the TabBar viewport width and scroll limits are known. +class _TabBarScrollPosition extends ScrollPositionWithSingleContext { + _TabBarScrollPosition({ + ScrollPhysics physics, + ScrollContext context, + ScrollPosition oldPosition, + this.tabBar, + }) : super( + physics: physics, + context: context, + initialPixels: null, + oldPosition: oldPosition, + ); + + final _TabBarState tabBar; + + bool _initialViewportDimensionWasZero; + + @override + bool applyContentDimensions(double minScrollExtent, double maxScrollExtent) { + bool result = true; + if (_initialViewportDimensionWasZero != true) { + // If the viewport never had a non-zero dimension, we just want to jump + // to the initial scroll position to avoid strange scrolling effects in + // release mode: In release mode, the viewport temporarily may have a + // dimension of zero before the actual dimension is calculated. In that + // scenario, setting the actual dimension would cause a strange scroll + // effect without this guard because the super call below would starts a + // ballistic scroll activity. + assert(viewportDimension != null); + _initialViewportDimensionWasZero = viewportDimension != 0.0; + correctPixels(tabBar._initialScrollOffset(viewportDimension, minScrollExtent, maxScrollExtent)); + result = false; + } + return super.applyContentDimensions(minScrollExtent, maxScrollExtent) && result; + } +} + +// This class, and TabBarScrollPosition, only exist to handle the case +// where a scrollable TabBar has a non-zero initialIndex. +class _TabBarScrollController extends ScrollController { + _TabBarScrollController(this.tabBar); + + final _TabBarState tabBar; + + @override + ScrollPosition createScrollPosition(ScrollPhysics physics, ScrollContext context, ScrollPosition oldPosition) { + return _TabBarScrollPosition( + physics: physics, + context: context, + oldPosition: oldPosition, + tabBar: tabBar, + ); + } +} + +/// A material design widget that displays a horizontal row of tabs. +/// +/// Typically created as the [AppBar.bottom] part of an [AppBar] and in +/// conjunction with a [TabBarView]. +/// +/// If a [TabController] is not provided, then a [DefaultTabController] ancestor +/// must be provided instead. The tab controller's [TabController.length] must +/// equal the length of the [tabs] list and the length of the +/// [TabBarView.children] list. +/// +/// Requires one of its ancestors to be a [Material] widget. +/// +/// Uses values from [TabBarTheme] if it is set in the current context. +/// +/// To see a sample implementation, visit the [TabController] documentation. +/// +/// See also: +/// +/// * [TabBarView], which displays page views that correspond to each tab. +class NoShadowTabBar extends StatefulWidget implements PreferredSizeWidget { + /// Creates a material design tab bar. + /// + /// The [tabs] argument must not be null and its length must match the [controller]'s + /// [TabController.length]. + /// + /// If a [TabController] is not provided, then there must be a + /// [DefaultTabController] ancestor. + /// + /// The [indicatorWeight] parameter defaults to 2, and must not be null. + /// + /// The [indicatorPadding] parameter defaults to [EdgeInsets.zero], and must not be null. + /// + /// If [indicator] is not null, then [indicatorWeight], [indicatorPadding], and + /// [indicatorColor] are ignored. + const NoShadowTabBar({ + Key key, + @required this.tabs, + this.controller, + this.isScrollable = false, + this.indicatorColor, + this.indicatorWeight = 2.0, + this.indicatorPadding = EdgeInsets.zero, + this.indicator, + this.indicatorSize, + this.labelColor, + this.labelStyle, + this.labelPadding, + this.unselectedLabelColor, + this.unselectedLabelStyle, + this.dragStartBehavior = DragStartBehavior.start, + this.onTap, + }) : assert(tabs != null), + assert(isScrollable != null), + assert(dragStartBehavior != null), + assert(indicator != null || (indicatorWeight != null && indicatorWeight > 0.0)), + assert(indicator != null || (indicatorPadding != null)), + super(key: key); + + /// Typically a list of two or more [Tab] widgets. + /// + /// The length of this list must match the [controller]'s [TabController.length] + /// and the length of the [TabBarView.children] list. + final List tabs; + + /// This widget's selection and animation state. + /// + /// If [TabController] is not provided, then the value of [DefaultTabController.of] + /// will be used. + final TabController controller; + + /// Whether this tab bar can be scrolled horizontally. + /// + /// If [isScrollable] is true, then each tab is as wide as needed for its label + /// and the entire [TabBar] is scrollable. Otherwise each tab gets an equal + /// share of the available space. + final bool isScrollable; + + /// The color of the line that appears below the selected tab. + /// + /// If this parameter is null, then the value of the Theme's indicatorColor + /// property is used. + /// + /// If [indicator] is specified, this property is ignored. + final Color indicatorColor; + + /// The thickness of the line that appears below the selected tab. + /// + /// The value of this parameter must be greater than zero and its default + /// value is 2.0. + /// + /// If [indicator] is specified, this property is ignored. + final double indicatorWeight; + + /// The horizontal padding for the line that appears below the selected tab. + /// + /// For [isScrollable] tab bars, specifying [kTabLabelPadding] will align + /// the indicator with the tab's text for [Tab] widgets and all but the + /// shortest [Tab.text] values. + /// + /// The [EdgeInsets.top] and [EdgeInsets.bottom] values of the + /// [indicatorPadding] are ignored. + /// + /// The default value of [indicatorPadding] is [EdgeInsets.zero]. + /// + /// If [indicator] is specified, this property is ignored. + final EdgeInsetsGeometry indicatorPadding; + + /// Defines the appearance of the selected tab indicator. + /// + /// If [indicator] is specified, the [indicatorColor], [indicatorWeight], + /// and [indicatorPadding] properties are ignored. + /// + /// The default, underline-style, selected tab indicator can be defined with + /// [UnderlineTabIndicator]. + /// + /// The indicator's size is based on the tab's bounds. If [indicatorSize] + /// is [TabBarIndicatorSize.tab] the tab's bounds are as wide as the space + /// occupied by the tab in the tab bar. If [indicatorSize] is + /// [TabBarIndicatorSize.label], then the tab's bounds are only as wide as + /// the tab widget itself. + final Decoration indicator; + + /// Defines how the selected tab indicator's size is computed. + /// + /// The size of the selected tab indicator is defined relative to the + /// tab's overall bounds if [indicatorSize] is [TabBarIndicatorSize.tab] + /// (the default) or relative to the bounds of the tab's widget if + /// [indicatorSize] is [TabBarIndicatorSize.label]. + /// + /// The selected tab's location appearance can be refined further with + /// the [indicatorColor], [indicatorWeight], [indicatorPadding], and + /// [indicator] properties. + final TabBarIndicatorSize indicatorSize; + + /// The color of selected tab labels. + /// + /// Unselected tab labels are rendered with the same color rendered at 70% + /// opacity unless [unselectedLabelColor] is non-null. + /// + /// If this parameter is null, then the color of the [ThemeData.primaryTextTheme]'s + /// body2 text color is used. + final Color labelColor; + + /// The color of unselected tab labels. + /// + /// If this property is null, unselected tab labels are rendered with the + /// [labelColor] with 70% opacity. + final Color unselectedLabelColor; + + /// The text style of the selected tab labels. + /// + /// If [unselectedLabelStyle] is null, then this text style will be used for + /// both selected and unselected label styles. + /// + /// If this property is null, then the text style of the + /// [ThemeData.primaryTextTheme]'s body2 definition is used. + final TextStyle labelStyle; + + /// The padding added to each of the tab labels. + /// + /// If this property is null, then kTabLabelPadding is used. + final EdgeInsetsGeometry labelPadding; + + /// The text style of the unselected tab labels + /// + /// If this property is null, then the [labelStyle] value is used. If [labelStyle] + /// is null, then the text style of the [ThemeData.primaryTextTheme]'s + /// body2 definition is used. + final TextStyle unselectedLabelStyle; + + /// {@macro flutter.widgets.scrollable.dragStartBehavior} + final DragStartBehavior dragStartBehavior; + + /// An optional callback that's called when the [TabBar] is tapped. + /// + /// The callback is applied to the index of the tab where the tap occurred. + /// + /// This callback has no effect on the default handling of taps. It's for + /// applications that want to do a little extra work when a tab is tapped, + /// even if the tap doesn't change the TabController's index. TabBar [onTap] + /// callbacks should not make changes to the TabController since that would + /// interfere with the default tap handler. + final ValueChanged onTap; + + /// A size whose height depends on if the tabs have both icons and text. + /// + /// [AppBar] uses this size to compute its own preferred size. + @override + Size get preferredSize { + for (Widget item in tabs) { + if (item is Tab) { + final Tab tab = item; + if (tab.text != null && tab.icon != null) + return Size.fromHeight(_kTextAndIconTabHeight + indicatorWeight); + } + } + return Size.fromHeight(_kTabHeight + indicatorWeight); + } + + @override + _TabBarState createState() => _TabBarState(); +} + +class _TabBarState extends State { + ScrollController _scrollController; + TabController _controller; + _IndicatorPainter _indicatorPainter; + int _currentIndex; + double _tabStripWidth; + List _tabKeys; + + @override + void initState() { + super.initState(); + // If indicatorSize is TabIndicatorSize.label, _tabKeys[i] is used to find + // the width of tab widget i. See _IndicatorPainter.indicatorRect(). + _tabKeys = widget.tabs.map((Widget tab) => GlobalKey()).toList(); + } + + Decoration get _indicator { + if (widget.indicator != null) + return widget.indicator; + final TabBarTheme tabBarTheme = TabBarTheme.of(context); + if (tabBarTheme.indicator != null) + return tabBarTheme.indicator; + + Color color = widget.indicatorColor ?? Theme.of(context).indicatorColor; + // ThemeData tries to avoid this by having indicatorColor avoid being the + // primaryColor. However, it's possible that the tab bar is on a + // Material that isn't the primaryColor. In that case, if the indicator + // color ends up matching the material's color, then this overrides it. + // When that happens, automatic transitions of the theme will likely look + // ugly as the indicator color suddenly snaps to white at one end, but it's + // not clear how to avoid that any further. + // + // The material's color might be null (if it's a transparency). In that case + // there's no good way for us to find out what the color is so we don't. + if (color.value == Material.of(context).color?.value) + color = Colors.white; + + return UnderlineTabIndicator( + insets: widget.indicatorPadding, + borderSide: BorderSide( + width: widget.indicatorWeight, + color: color, + ), + ); + } + + // If the TabBar is rebuilt with a new tab controller, the caller should + // dispose the old one. In that case the old controller's animation will be + // null and should not be accessed. + bool get _controllerIsValid => _controller?.animation != null; + + void _updateTabController() { + final TabController newController = widget.controller ?? DefaultTabController.of(context); + assert(() { + if (newController == null) { + throw FlutterError( + 'No TabController for ${widget.runtimeType}.\n' + 'When creating a ${widget.runtimeType}, you must either provide an explicit ' + 'TabController using the "controller" property, or you must ensure that there ' + 'is a DefaultTabController above the ${widget.runtimeType}.\n' + 'In this case, there was neither an explicit controller nor a default controller.' + ); + } + return true; + }()); + + if (newController == _controller) + return; + + if (_controllerIsValid) { + _controller.animation.removeListener(_handleTabControllerAnimationTick); + _controller.removeListener(_handleTabControllerTick); + } + _controller = newController; + if (_controller != null) { + _controller.animation.addListener(_handleTabControllerAnimationTick); + _controller.addListener(_handleTabControllerTick); + _currentIndex = _controller.index; + } + } + + void _initIndicatorPainter() { + _indicatorPainter = !_controllerIsValid ? null : _IndicatorPainter( + controller: _controller, + indicator: _indicator, + indicatorSize: widget.indicatorSize ?? TabBarTheme.of(context).indicatorSize, + tabKeys: _tabKeys, + old: _indicatorPainter, + ); + } + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + assert(debugCheckHasMaterial(context)); + _updateTabController(); + _initIndicatorPainter(); + } + + @override + void didUpdateWidget(NoShadowTabBar oldWidget) { + super.didUpdateWidget(oldWidget); + if (widget.controller != oldWidget.controller) { + _updateTabController(); + _initIndicatorPainter(); + } else if (widget.indicatorColor != oldWidget.indicatorColor || + widget.indicatorWeight != oldWidget.indicatorWeight || + widget.indicatorSize != oldWidget.indicatorSize || + widget.indicator != oldWidget.indicator) { + _initIndicatorPainter(); + } + + if (widget.tabs.length > oldWidget.tabs.length) { + final int delta = widget.tabs.length - oldWidget.tabs.length; + _tabKeys.addAll(List.generate(delta, (int n) => GlobalKey())); + } else if (widget.tabs.length < oldWidget.tabs.length) { + _tabKeys.removeRange(widget.tabs.length, oldWidget.tabs.length); + } + } + + @override + void dispose() { + _indicatorPainter.dispose(); + if (_controllerIsValid) { + _controller.animation.removeListener(_handleTabControllerAnimationTick); + _controller.removeListener(_handleTabControllerTick); + } + _controller = null; + // We don't own the _controller Animation, so it's not disposed here. + super.dispose(); + } + + int get maxTabIndex => _indicatorPainter.maxTabIndex; + + double _tabScrollOffset(int index, double viewportWidth, double minExtent, double maxExtent) { + if (!widget.isScrollable) + return 0.0; + double tabCenter = _indicatorPainter.centerOf(index); + switch (Directionality.of(context)) { + case TextDirection.rtl: + tabCenter = _tabStripWidth - tabCenter; + break; + case TextDirection.ltr: + break; + } + return (tabCenter - viewportWidth / 2.0).clamp(minExtent, maxExtent); + } + + double _tabCenteredScrollOffset(int index) { + final ScrollPosition position = _scrollController.position; + return _tabScrollOffset(index, position.viewportDimension, position.minScrollExtent, position.maxScrollExtent); + } + + double _initialScrollOffset(double viewportWidth, double minExtent, double maxExtent) { + return _tabScrollOffset(_currentIndex, viewportWidth, minExtent, maxExtent); + } + + void _scrollToCurrentIndex() { + final double offset = _tabCenteredScrollOffset(_currentIndex); + _scrollController.animateTo(offset, duration: kTabScrollDuration, curve: Curves.ease); + } + + void _scrollToControllerValue() { + final double leadingPosition = _currentIndex > 0 ? _tabCenteredScrollOffset(_currentIndex - 1) : null; + final double middlePosition = _tabCenteredScrollOffset(_currentIndex); + final double trailingPosition = _currentIndex < maxTabIndex ? _tabCenteredScrollOffset(_currentIndex + 1) : null; + + final double index = _controller.index.toDouble(); + final double value = _controller.animation.value; + double offset; + if (value == index - 1.0) + offset = leadingPosition ?? middlePosition; + else if (value == index + 1.0) + offset = trailingPosition ?? middlePosition; + else if (value == index) + offset = middlePosition; + else if (value < index) + offset = leadingPosition == null ? middlePosition : lerpDouble(middlePosition, leadingPosition, index - value); + else + offset = trailingPosition == null ? middlePosition : lerpDouble(middlePosition, trailingPosition, value - index); + + _scrollController.jumpTo(offset); + } + + void _handleTabControllerAnimationTick() { + assert(mounted); + if (!_controller.indexIsChanging && widget.isScrollable) { + // Sync the TabBar's scroll position with the TabBarView's PageView. + _currentIndex = _controller.index; + _scrollToControllerValue(); + } + } + + void _handleTabControllerTick() { + if (_controller.index != _currentIndex) { + _currentIndex = _controller.index; + if (widget.isScrollable) + _scrollToCurrentIndex(); + } + setState(() { + // Rebuild the tabs after a (potentially animated) index change + // has completed. + }); + } + + // Called each time layout completes. + void _saveTabOffsets(List tabOffsets, TextDirection textDirection, double width) { + _tabStripWidth = width; + _indicatorPainter?.saveTabOffsets(tabOffsets, textDirection); + } + + void _handleTap(int index) { + assert(index >= 0 && index < widget.tabs.length); + _controller.animateTo(index); + if (widget.onTap != null) { + widget.onTap(index); + } + } + + Widget _buildStyledTab(Widget child, bool selected, Animation animation) { + return _TabStyle( + animation: animation, + selected: selected, + labelColor: widget.labelColor, + unselectedLabelColor: widget.unselectedLabelColor, + labelStyle: widget.labelStyle, + unselectedLabelStyle: widget.unselectedLabelStyle, + child: child, + ); + } + + @override + Widget build(BuildContext context) { + assert(debugCheckHasMaterialLocalizations(context)); + assert(() { + if (_controller.length != widget.tabs.length) { + throw FlutterError( + 'Controller\'s length property (${_controller.length}) does not match the \n' + 'number of tabs (${widget.tabs.length}) present in TabBar\'s tabs property.' + ); + } + return true; + }()); + final MaterialLocalizations localizations = MaterialLocalizations.of(context); + if (_controller.length == 0) { + return Container( + height: _kTabHeight + widget.indicatorWeight, + ); + } + + final TabBarTheme tabBarTheme = TabBarTheme.of(context); + + final List wrappedTabs = List(widget.tabs.length); + for (int i = 0; i < widget.tabs.length; i += 1) { + wrappedTabs[i] = Center( + heightFactor: 1.0, + child: Padding( + padding: widget.labelPadding ?? tabBarTheme.labelPadding ?? kTabLabelPadding, + child: KeyedSubtree( + key: _tabKeys[i], + child: widget.tabs[i], + ), + ), + ); + + } + + // If the controller was provided by DefaultTabController and we're part + // of a Hero (typically the AppBar), then we will not be able to find the + // controller during a Hero transition. See https://github.com/flutter/flutter/issues/213. + if (_controller != null) { + final int previousIndex = _controller.previousIndex; + + if (_controller.indexIsChanging) { + // The user tapped on a tab, the tab controller's animation is running. + assert(_currentIndex != previousIndex); + final Animation animation = _ChangeAnimation(_controller); + wrappedTabs[_currentIndex] = _buildStyledTab(wrappedTabs[_currentIndex], true, animation); + wrappedTabs[previousIndex] = _buildStyledTab(wrappedTabs[previousIndex], false, animation); + } else { + // The user is dragging the TabBarView's PageView left or right. + final int tabIndex = _currentIndex; + final Animation centerAnimation = _DragAnimation(_controller, tabIndex); + wrappedTabs[tabIndex] = _buildStyledTab(wrappedTabs[tabIndex], true, centerAnimation); + if (_currentIndex > 0) { + final int tabIndex = _currentIndex - 1; + final Animation previousAnimation = ReverseAnimation(_DragAnimation(_controller, tabIndex)); + wrappedTabs[tabIndex] = _buildStyledTab(wrappedTabs[tabIndex], false, previousAnimation); + } + if (_currentIndex < widget.tabs.length - 1) { + final int tabIndex = _currentIndex + 1; + final Animation nextAnimation = ReverseAnimation(_DragAnimation(_controller, tabIndex)); + wrappedTabs[tabIndex] = _buildStyledTab(wrappedTabs[tabIndex], false, nextAnimation); + } + } + } + + // Add the tap handler to each tab. If the tab bar is not scrollable, + // then give all of the tabs equal flexibility so that they each occupy + // the same share of the tab bar's overall width. + final int tabCount = widget.tabs.length; + for (int index = 0; index < tabCount; index += 1) { + wrappedTabs[index] = GestureDetector( + onTap: () { _handleTap(index); }, + child: Container( + color: Colors.transparent, + padding: EdgeInsets.only(bottom: widget.indicatorWeight), + child: Stack( + children: [ + wrappedTabs[index], + Semantics( + selected: index == _currentIndex, + label: localizations.tabLabel(tabIndex: index + 1, tabCount: tabCount), + ), + ], + ), + ), + ); + if (!widget.isScrollable) + wrappedTabs[index] = Expanded(child: wrappedTabs[index]); + } + + Widget tabBar = CustomPaint( + painter: _indicatorPainter, + child: _TabStyle( + animation: kAlwaysDismissedAnimation, + selected: false, + labelColor: widget.labelColor, + unselectedLabelColor: widget.unselectedLabelColor, + labelStyle: widget.labelStyle, + unselectedLabelStyle: widget.unselectedLabelStyle, + child: _TabLabelBar( + onPerformLayout: _saveTabOffsets, + children: wrappedTabs, + ), + ), + ); + + if (widget.isScrollable) { + _scrollController ??= _TabBarScrollController(this); + tabBar = SingleChildScrollView( + dragStartBehavior: widget.dragStartBehavior, + scrollDirection: Axis.horizontal, + controller: _scrollController, + child: tabBar, + ); + } + + return tabBar; + } +} + + +final PageScrollPhysics _kTabBarViewPhysics = const PageScrollPhysics().applyTo(const ClampingScrollPhysics()); + +class _TabBarViewState extends State { + TabController _controller; + PageController _pageController; + List _children; + List _childrenWithKey; + int _currentIndex; + int _warpUnderwayCount = 0; + + // If the TabBarView is rebuilt with a new tab controller, the caller should + // dispose the old one. In that case the old controller's animation will be + // null and should not be accessed. + bool get _controllerIsValid => _controller?.animation != null; + + void _updateTabController() { + final TabController newController = widget.controller ?? DefaultTabController.of(context); + assert(() { + if (newController == null) { + throw FlutterError( + 'No TabController for ${widget.runtimeType}.\n' + 'When creating a ${widget.runtimeType}, you must either provide an explicit ' + 'TabController using the "controller" property, or you must ensure that there ' + 'is a DefaultTabController above the ${widget.runtimeType}.\n' + 'In this case, there was neither an explicit controller nor a default controller.' + ); + } + return true; + }()); + + if (newController == _controller) + return; + + if (_controllerIsValid) + _controller.animation.removeListener(_handleTabControllerAnimationTick); + _controller = newController; + if (_controller != null) + _controller.animation.addListener(_handleTabControllerAnimationTick); + } + + @override + void initState() { + super.initState(); + _updateChildren(); + } + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + _updateTabController(); + _currentIndex = _controller?.index; + _pageController = PageController(initialPage: _currentIndex ?? 0); + } + + @override + void didUpdateWidget(TabBarView oldWidget) { + super.didUpdateWidget(oldWidget); + if (widget.controller != oldWidget.controller) + _updateTabController(); + if (widget.children != oldWidget.children && _warpUnderwayCount == 0) + _updateChildren(); + } + + @override + void dispose() { + if (_controllerIsValid) + _controller.animation.removeListener(_handleTabControllerAnimationTick); + _controller = null; + // We don't own the _controller Animation, so it's not disposed here. + super.dispose(); + } + + void _updateChildren() { + _children = widget.children; + _childrenWithKey = KeyedSubtree.ensureUniqueKeysForList(widget.children); + } + + void _handleTabControllerAnimationTick() { + if (_warpUnderwayCount > 0 || !_controller.indexIsChanging) + return; // This widget is driving the controller's animation. + + if (_controller.index != _currentIndex) { + _currentIndex = _controller.index; + _warpToCurrentIndex(); + } + } + + Future _warpToCurrentIndex() async { + if (!mounted) + return Future.value(); + + if (_pageController.page == _currentIndex.toDouble()) + return Future.value(); + + final int previousIndex = _controller.previousIndex; + if ((_currentIndex - previousIndex).abs() == 1) + return _pageController.animateToPage(_currentIndex, duration: kTabScrollDuration, curve: Curves.ease); + + assert((_currentIndex - previousIndex).abs() > 1); + final int initialPage = _currentIndex > previousIndex + ? _currentIndex - 1 + : _currentIndex + 1; + final List originalChildren = _childrenWithKey; + setState(() { + _warpUnderwayCount += 1; + + _childrenWithKey = List.from(_childrenWithKey, growable: false); + final Widget temp = _childrenWithKey[initialPage]; + _childrenWithKey[initialPage] = _childrenWithKey[previousIndex]; + _childrenWithKey[previousIndex] = temp; + }); + _pageController.jumpToPage(initialPage); + + await _pageController.animateToPage(_currentIndex, duration: kTabScrollDuration, curve: Curves.ease); + if (!mounted) + return Future.value(); + setState(() { + _warpUnderwayCount -= 1; + if (widget.children != _children) { + _updateChildren(); + } else { + _childrenWithKey = originalChildren; + } + }); + } + + // Called when the PageView scrolls + bool _handleScrollNotification(ScrollNotification notification) { + if (_warpUnderwayCount > 0) + return false; + + if (notification.depth != 0) + return false; + + _warpUnderwayCount += 1; + if (notification is ScrollUpdateNotification && !_controller.indexIsChanging) { + if ((_pageController.page - _controller.index).abs() > 1.0) { + _controller.index = _pageController.page.floor(); + _currentIndex =_controller.index; + } + _controller.offset = (_pageController.page - _controller.index).clamp(-1.0, 1.0); + } else if (notification is ScrollEndNotification) { + _controller.index = _pageController.page.round(); + _currentIndex = _controller.index; + } + _warpUnderwayCount -= 1; + + return false; + } + + @override + Widget build(BuildContext context) { + assert(() { + if (_controller.length != widget.children.length) { + throw FlutterError( + 'Controller\'s length property (${_controller.length}) does not match the \n' + 'number of tabs (${widget.children.length}) present in TabBar\'s tabs property.' + ); + } + return true; + }()); + return NotificationListener( + onNotification: _handleScrollNotification, + child: PageView( + dragStartBehavior: widget.dragStartBehavior, + controller: _pageController, + physics: widget.physics == null ? _kTabBarViewPhysics : _kTabBarViewPhysics.applyTo(widget.physics), + children: _childrenWithKey, + ), + ); + } +} + +/// Displays a single circle with the specified border and background colors. +/// +/// Used by [TabPageSelector] to indicate the selected page. +class TabPageSelectorIndicator extends StatelessWidget { + /// Creates an indicator used by [TabPageSelector]. + /// + /// The [backgroundColor], [borderColor], and [size] parameters must not be null. + const TabPageSelectorIndicator({ + Key key, + @required this.backgroundColor, + @required this.borderColor, + @required this.size, + }) : assert(backgroundColor != null), + assert(borderColor != null), + assert(size != null), + super(key: key); + + /// The indicator circle's background color. + final Color backgroundColor; + + /// The indicator circle's border color. + final Color borderColor; + + /// The indicator circle's diameter. + final double size; + + @override + Widget build(BuildContext context) { + return Container( + width: size, + height: size, + margin: const EdgeInsets.all(4.0), + decoration: BoxDecoration( + color: backgroundColor, + border: Border.all(color: borderColor), + shape: BoxShape.circle, + ), + ); + } +} + +/// Displays a row of small circular indicators, one per tab. +/// +/// The selected tab's indicator is highlighted. Often used in conjunction with +/// a [TabBarView]. +/// +/// If a [TabController] is not provided, then there must be a +/// [DefaultTabController] ancestor. +class TabPageSelector extends StatelessWidget { + /// Creates a compact widget that indicates which tab has been selected. + const TabPageSelector({ + Key key, + this.controller, + this.indicatorSize = 12.0, + this.color, + this.selectedColor, + }) : assert(indicatorSize != null && indicatorSize > 0.0), + super(key: key); + + /// This widget's selection and animation state. + /// + /// If [TabController] is not provided, then the value of + /// [DefaultTabController.of] will be used. + final TabController controller; + + /// The indicator circle's diameter (the default value is 12.0). + final double indicatorSize; + + /// The indicator circle's fill color for unselected pages. + /// + /// If this parameter is null, then the indicator is filled with [Colors.transparent]. + final Color color; + + /// The indicator circle's fill color for selected pages and border color + /// for all indicator circles. + /// + /// If this parameter is null, then the indicator is filled with the theme's + /// accent color, [ThemeData.accentColor]. + final Color selectedColor; + + Widget _buildTabIndicator( + int tabIndex, + TabController tabController, + ColorTween selectedColorTween, + ColorTween previousColorTween, + ) { + Color background; + if (tabController.indexIsChanging) { + // The selection's animation is animating from previousValue to value. + final double t = 1.0 - _indexChangeProgress(tabController); + if (tabController.index == tabIndex) + background = selectedColorTween.lerp(t); + else if (tabController.previousIndex == tabIndex) + background = previousColorTween.lerp(t); + else + background = selectedColorTween.begin; + } else { + // The selection's offset reflects how far the TabBarView has / been dragged + // to the previous page (-1.0 to 0.0) or the next page (0.0 to 1.0). + final double offset = tabController.offset; + if (tabController.index == tabIndex) { + background = selectedColorTween.lerp(1.0 - offset.abs()); + } else if (tabController.index == tabIndex - 1 && offset > 0.0) { + background = selectedColorTween.lerp(offset); + } else if (tabController.index == tabIndex + 1 && offset < 0.0) { + background = selectedColorTween.lerp(-offset); + } else { + background = selectedColorTween.begin; + } + } + return TabPageSelectorIndicator( + backgroundColor: background, + borderColor: selectedColorTween.end, + size: indicatorSize, + ); + } + + @override + Widget build(BuildContext context) { + final Color fixColor = color ?? Colors.transparent; + final Color fixSelectedColor = selectedColor ?? Theme.of(context).accentColor; + final ColorTween selectedColorTween = ColorTween(begin: fixColor, end: fixSelectedColor); + final ColorTween previousColorTween = ColorTween(begin: fixSelectedColor, end: fixColor); + final TabController tabController = controller ?? DefaultTabController.of(context); + assert(() { + if (tabController == null) { + throw FlutterError( + 'No TabController for $runtimeType.\n' + 'When creating a $runtimeType, you must either provide an explicit TabController ' + 'using the "controller" property, or you must ensure that there is a ' + 'DefaultTabController above the $runtimeType.\n' + 'In this case, there was neither an explicit controller nor a default controller.' + ); + } + return true; + }()); + final Animation animation = CurvedAnimation( + parent: tabController.animation, + curve: Curves.fastOutSlowIn, + ); + return AnimatedBuilder( + animation: animation, + builder: (BuildContext context, Widget child) { + return Semantics( + label: 'Page ${tabController.index + 1} of ${tabController.length}', + child: Row( + mainAxisSize: MainAxisSize.min, + children: List.generate(tabController.length, (int tabIndex) { + return _buildTabIndicator(tabIndex, tabController, selectedColorTween, previousColorTween); + }).toList(), + ), + ); + }, + ); + } +} diff --git a/lib/views/widgets/StatelessWidget/TabBar/node2_noShadow.dart b/lib/views/widgets/StatelessWidget/TabBar/node2_noShadow.dart index a638674..709be82 100644 --- a/lib/views/widgets/StatelessWidget/TabBar/node2_noShadow.dart +++ b/lib/views/widgets/StatelessWidget/TabBar/node2_noShadow.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:flutter_unit/components/flutter/no_shadow_tab_bar.dart'; + +import 'no_shadow_tab_bar.dart'; /// create by 张风捷特烈 on 2020/4/27 /// contact me by email 1981462002@qq.com diff --git a/lib/views/widgets/exp/render_object_unit.dart b/lib/views/widgets/exp/render_object_unit.dart index 0190ea9..1738384 100644 --- a/lib/views/widgets/exp/render_object_unit.dart +++ b/lib/views/widgets/exp/render_object_unit.dart @@ -30,13 +30,20 @@ export '../SingleChildRenderObjectWidget/ConstrainedBox/node1_base.dart'; export '../SingleChildRenderObjectWidget/ColorFiltered/node1_base.dart'; export '../SingleChildRenderObjectWidget/Baseline/node1_base.dart'; export '../SingleChildRenderObjectWidget/DecoratedBox/node1_base.dart'; +export '../SingleChildRenderObjectWidget/DecoratedBox/node2_image.dart'; +export '../SingleChildRenderObjectWidget/DecoratedBox/node3_border.dart'; +export '../SingleChildRenderObjectWidget/DecoratedBox/node4_shape.dart'; +export '../SingleChildRenderObjectWidget/DecoratedBox/node5_line.dart'; +export '../SingleChildRenderObjectWidget/DecoratedBox/node6_flutterLogo.dart'; export '../SingleChildRenderObjectWidget/FadeTransition/node1_base.dart'; export '../SingleChildRenderObjectWidget/FittedBox/node1_base.dart'; export '../SingleChildRenderObjectWidget/FractionallySizedBox/node1_base.dart'; export '../SingleChildRenderObjectWidget/LimiteBox/node1_base.dart'; export '../SingleChildRenderObjectWidget/OffStage/node1_base.dart'; export '../SingleChildRenderObjectWidget/Opacity/node1_base.dart'; -export '../SingleChildRenderObjectWidget/Padding/node1_base.dart'; +export '../SingleChildRenderObjectWidget/Padding/node1_all.dart'; +export '../SingleChildRenderObjectWidget/Padding/node2_only.dart'; +export '../SingleChildRenderObjectWidget/Padding/node3_symmetric.dart'; export '../SingleChildRenderObjectWidget/RotatedBox/node1_base.dart'; export '../SingleChildRenderObjectWidget/SizedBox/node1_base.dart'; export '../SingleChildRenderObjectWidget/SizedOverflowBox/node1_base.dart'; diff --git a/lib/views/widgets/exp/stateless_unit.dart b/lib/views/widgets/exp/stateless_unit.dart index 9a9e6ce..063b40a 100644 --- a/lib/views/widgets/exp/stateless_unit.dart +++ b/lib/views/widgets/exp/stateless_unit.dart @@ -7,6 +7,8 @@ export '../StatelessWidget/AlertDialog/node1_base.dart'; export '../StatelessWidget/AnimatedIcon/node1_base.dart'; export '../StatelessWidget/Card/node1_base.dart'; export '../StatelessWidget/Card/node2_shape.dart'; +export '../StatelessWidget/PreferredSize/node1_base.dart'; +export '../StatelessWidget/PreferredSize/node2_adapter.dart'; export '../StatelessWidget/CheckboxListTile/node1_base.dart'; export '../StatelessWidget/CheckboxListTile/node2_select.dart'; @@ -95,6 +97,7 @@ export '../StatelessWidget/VerticalDivider/node2_height.dart'; export '../StatelessWidget/BackButton/node1_base.dart'; export '../StatelessWidget/ButtonBar/node1_base.dart'; +export '../StatelessWidget/ButtonBar/node2_padding.dart'; export '../StatelessWidget/CloseButton/node1_base.dart'; export '../StatelessWidget/FlatButton/node1_base.dart'; diff --git a/lib/views/widgets/widgets_map.dart b/lib/views/widgets/widgets_map.dart index e01c23a..bec3e1e 100644 --- a/lib/views/widgets/widgets_map.dart +++ b/lib/views/widgets/widgets_map.dart @@ -332,7 +332,12 @@ class WidgetsMap { ]; case "DecoratedBox": return [ - CustomDecoratedBox(), + BoxDecorationDemo(), + ShapeImageDemo(), + BorderDemo(), + ShapeDecorationDemo(), + UnderlineTabIndicatorDemo(), + FlutterLogoDecorationDemo(), ]; case "Offstage": return [ @@ -348,7 +353,9 @@ class WidgetsMap { ]; case "Padding": return [ - CustomPadding(), + PaddingAll(), + PaddingOnly(), + PaddingSymmetric(), ]; case "Baseline": return [ @@ -663,6 +670,11 @@ class WidgetsMap { return [ CustomTab(), ]; + case "PreferredSize": + return [ + CustomPreferredSize(), + AdapterPreferredSize(), + ]; case "InkResponse": return [ CustomInkResponse(),