From da9764a51ce45efefbcf864f20017d216bc7800e Mon Sep 17 00:00:00 2001 From: toly <1981462002@qq.com> Date: Sun, 20 Dec 2020 16:58:17 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20ModalBarrier=E3=80=81AnimatedModal?= =?UTF-8?q?Barrier=E3=80=81DefaultAssetBundle=E3=80=81DropdownButtonFormFi?= =?UTF-8?q?eld=E3=80=81FormField=E3=80=81InheritedWidget=E3=80=81Paginated?= =?UTF-8?q?DataTable?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/flutter.db | Bin 946176 -> 970752 bytes .../DefaultAssetBundle/node1_base.dart | 51 +++++ .../InheritedTheme/node1_base.dart | 32 +-- .../InheritedWidget/node1_base.dart | 58 +++++ .../AnimatedModalBarrier/node1_base.dart | 55 +++++ .../DropdownButtonFormField/node1_base.dart | 69 ++++++ .../StatefulWidget/FormField/node1_base.dart | 36 +++ .../PaginatedDataTable/node1_base.dart | 214 ++++++++++++++++++ .../TextFormField/node1_base.dart | 44 ++-- .../ModalBarrier/node1_base.dart | 32 +++ lib/views/widgets/exp/proxy_unit.dart | 2 + lib/views/widgets/exp/stateful_unit.dart | 4 + lib/views/widgets/exp/stateless_unit.dart | 1 + lib/views/widgets/widgets_map.dart | 28 +++ 14 files changed, 581 insertions(+), 45 deletions(-) create mode 100644 lib/views/widgets/ProxyWidget/DefaultAssetBundle/node1_base.dart create mode 100644 lib/views/widgets/ProxyWidget/InheritedWidget/node1_base.dart create mode 100644 lib/views/widgets/StatefulWidget/AnimatedModalBarrier/node1_base.dart create mode 100644 lib/views/widgets/StatefulWidget/DropdownButtonFormField/node1_base.dart create mode 100644 lib/views/widgets/StatefulWidget/FormField/node1_base.dart create mode 100644 lib/views/widgets/StatefulWidget/PaginatedDataTable/node1_base.dart create mode 100644 lib/views/widgets/StatelessWidget/ModalBarrier/node1_base.dart diff --git a/assets/flutter.db b/assets/flutter.db index f9700574be35ea41eeeb59f5d7ea21506fb8906e..2b1955db79f852237a956e6f2225858797a8a68b 100644 GIT binary patch delta 20968 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 delta 8425 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 R#hlgj_O*jedpy1Ae*<1aMG*i1 diff --git a/lib/views/widgets/ProxyWidget/DefaultAssetBundle/node1_base.dart b/lib/views/widgets/ProxyWidget/DefaultAssetBundle/node1_base.dart new file mode 100644 index 0000000..942dcbc --- /dev/null +++ b/lib/views/widgets/ProxyWidget/DefaultAssetBundle/node1_base.dart @@ -0,0 +1,51 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'dart:ui' as ui; +/// create by 张风捷特烈 on 2020-04-01 +/// contact me by email 1981462002@qq.com +/// 说明: 320 DefaultAssetBundle 默认资源包 +/// 一个 InheritedWidget,设置 AssetBundle 对象后,该节点后的节点上下文可以通过 DefaultAssetBundle.of(context) 获取 AssetBundle 对象用于访问资源文件。 +// { +// "widgetId": 320, +// "name": 'DefaultAssetBundle 介绍', +// "priority": 1, +// "subtitle": +// "【bundle】 : *资源包 【AssetBundle】\n" +// "【child】 : *子组件 【Widget】\n" +// "我们可以定义自己的 DefaultAssetBundle 来供后续节点使用,也可以直接使用默认的。该案例演示通过框架提供的 DefaultAssetBundle 加载一张资源图片进行显示。", +// } +class DefaultAssetBundleDemo extends StatefulWidget { + @override + _DefaultAssetBundleDemoState createState() => _DefaultAssetBundleDemoState(); +} + +class _DefaultAssetBundleDemoState extends State { + ui.Image _image; + @override + void initState() { + super.initState(); + _load(); + } + + @override + Widget build(BuildContext context) { + + return Container( + width: 150, + height: 150, + color: Colors.blue.withOpacity(0.1), + padding: EdgeInsets.all(10), + margin: EdgeInsets.all(10), + child: _image==null?Container():RawImage(image: _image,fit: BoxFit.cover,), + ); + } + + void _load() async{ + AssetBundle info = DefaultAssetBundle.of(context); + ByteData data = await info.load('assets/images/sabar.webp'); + _image = await decodeImageFromList(data.buffer.asUint8List()); + setState(() { + + }); + } +} diff --git a/lib/views/widgets/ProxyWidget/InheritedTheme/node1_base.dart b/lib/views/widgets/ProxyWidget/InheritedTheme/node1_base.dart index 65e0450..da33c08 100644 --- a/lib/views/widgets/ProxyWidget/InheritedTheme/node1_base.dart +++ b/lib/views/widgets/ProxyWidget/InheritedTheme/node1_base.dart @@ -36,24 +36,24 @@ class TestBody extends StatelessWidget { margin: EdgeInsets.only(left: 40,right: 40), alignment: Alignment.center, color: Theme.of(context).primaryColor.withOpacity(0.1), - child: Text('点我进入下页'))); + child: Text('InheritedTheme'))); } void _toNextPage(BuildContext context) { - final NavigatorState navigator = Navigator.of(context); - final CapturedThemes themes = - InheritedTheme.capture(from: context, to: navigator.context); - - Navigator.of(context).push( - MaterialPageRoute( - builder: (BuildContext _) { - return themes.wrap(Container( - alignment: Alignment.center, - color: Colors.white, - child: Text('Flutter Unit'), - )); - }, - ), - ); + // final NavigatorState navigator = Navigator.of(context); + // final CapturedThemes themes = + // InheritedTheme.capture(from: context, to: navigator.context); + // + // Navigator.of(context).push( + // MaterialPageRoute( + // builder: (BuildContext _) { + // return themes.wrap(Container( + // alignment: Alignment.center, + // color: Colors.white, + // child: Text('Flutter Unit'), + // )); + // }, + // ), + // ); } } diff --git a/lib/views/widgets/ProxyWidget/InheritedWidget/node1_base.dart b/lib/views/widgets/ProxyWidget/InheritedWidget/node1_base.dart new file mode 100644 index 0000000..2845693 --- /dev/null +++ b/lib/views/widgets/ProxyWidget/InheritedWidget/node1_base.dart @@ -0,0 +1,58 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com +/// 说明: 346 InheritedWidget 传承组件 +/// 该类是抽象类,作用是可以在本上下文存储数据,在其后续节点的上下文中共享该数据。有很多实现类,包括各种主题组件、MediaQuery等。 +/// link: 167,319,328,324,331 +/// +// { +// "widgetId": 346, +// "name": 'InheritedWidget 使用', +// "priority": 1, +// "subtitle": +// "【child】 : 子组件 【Widget】\n" +// "下面是一个简单的自定义 InheritedWidget,实现信息的子树共享。", +// } + +class InheritedWidgetDemo extends StatelessWidget { + final String info = + 'InheritedWidget 是一个抽象类,不可以直接使用。可以自定义对应共享数据的子类,如这里的通过 InfoInheritedWidget 实现:当前这段话可以在任意子树节点上下文获取。' + '一般都会定义一个 XXX.of(context) 的方法来获取数据,如 MediaQuery.of,Theme.of 等。'; + + @override + Widget build(BuildContext context) { + return InfoInheritedWidget( + info: info, + child: InfoWidget(), + ); + } +} + +class InfoWidget extends StatelessWidget { + @override + Widget build(BuildContext context) { + String info = InfoInheritedWidget.of(context).info; + + return Container( + color: Colors.blue.withOpacity(0.1), + padding: EdgeInsets.all(10), + margin: EdgeInsets.all(10), + child: Text(info), + ); + } +} + +class InfoInheritedWidget extends InheritedWidget { + final String info; + + InfoInheritedWidget({Key key, this.info, @required Widget child}) + : super(key: key, child: child); + + @override + bool updateShouldNotify(covariant InfoInheritedWidget oldWidget) => + info != oldWidget.info; + + static InfoInheritedWidget of(BuildContext context) => + context.dependOnInheritedWidgetOfExactType(); +} diff --git a/lib/views/widgets/StatefulWidget/AnimatedModalBarrier/node1_base.dart b/lib/views/widgets/StatefulWidget/AnimatedModalBarrier/node1_base.dart new file mode 100644 index 0000000..95ad73f --- /dev/null +++ b/lib/views/widgets/StatefulWidget/AnimatedModalBarrier/node1_base.dart @@ -0,0 +1,55 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-04-01 +/// contact me by email 1981462002@qq.com +/// 说明: 227 AnimatedModalBarrier 动画屏障模 +/// 内部依赖 ModalBarrier 实现,功能一致,只不过该组件可以传入一个颜色动画,进行过渡展现。 +/// link: 212 +// { +// "widgetId": 227, +// "name": 'AnimatedModalBarrier 介绍', +// "priority": 1, +// "subtitle": +// "【dismissible】 : 点击是否返回 【bool】\n" +// "【color】 : 颜色 【Animation】", +// } +class AnimatedModalBarrierDemo extends StatefulWidget { + @override + _AnimatedModalBarrierDemoState createState() => _AnimatedModalBarrierDemoState(); +} + +class _AnimatedModalBarrierDemoState extends State + with SingleTickerProviderStateMixin { + AnimationController _controller; + Animation _color; + + @override + void initState() { + super.initState(); + _controller = + AnimationController(vsync: this, duration: Duration(seconds: 2))..forward(); + _color = ColorTween(begin: Colors.blue, end: Colors.purple) + .animate(_controller); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Container( + width: 200, + height: 100, + child: Stack(alignment: Alignment.center, children: [ + AnimatedModalBarrier( + dismissible: true, + color: _color, + ), + Text('点击背景返回',style: TextStyle(color: Colors.white),) + ]), + ); + } +} diff --git a/lib/views/widgets/StatefulWidget/DropdownButtonFormField/node1_base.dart b/lib/views/widgets/StatefulWidget/DropdownButtonFormField/node1_base.dart new file mode 100644 index 0000000..18b6495 --- /dev/null +++ b/lib/views/widgets/StatefulWidget/DropdownButtonFormField/node1_base.dart @@ -0,0 +1,69 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020/9/21 +/// contact me by email 1981462002@qq.com +/// 说明: 223 DropdownButtonFormField 表单下拉框 +/// 底层依赖 DropdownButton 实现,所以基本属性类似。但拥有 FormField 的特性,可以回调 onSaved、validator 方法。 +/// link: 55,222 +/// +// { +// "widgetId": 223, +// "name": '表单下拉框简单使用', +// "priority": 1, +// "subtitle": +// "【items】 : 子组件列表 【List>】\n" +// "【validator】 : 表单验证回调 【FormFieldValidator】\n" +// "【onSaved】 : 表单保存回调 【FormFieldSetter】\n" +// "其他属性详见 DropdownButton,表单校验特性详见 FormField。", +// } + +class DropdownButtonFormFieldDemo extends StatefulWidget { + @override + _DropdownButtonFormFieldDemoState createState() => _DropdownButtonFormFieldDemoState(); +} + +class _DropdownButtonFormFieldDemoState extends State { + Color _color; + final _colors = [Colors.red, Colors.yellow, Colors.blue, Colors.green]; + final _info = ["红色", "黄色", "蓝色", "绿色"]; + + @override + Widget build(BuildContext context) { + return Wrap( + children: [ + Container( + margin: EdgeInsets.symmetric(horizontal: 20), + width: 50, + height: 50, + color: _color??_colors[0], + ), + + SizedBox( + width: 80, + child: DropdownButtonFormField( + value: _color, + elevation: 1, + hint: Text('选择颜色',style: TextStyle(fontSize: 12),), + icon: Icon( + Icons.expand_more, + size: 20, + color: _color, + ), + items: _buildItems(), + onChanged: (v) => setState(() => _color = v) + ), + ) + + ], + ); + } + + List> _buildItems() => _colors + .map((e) => DropdownMenuItem( + value: e, + child: Text( + _info[_colors.indexOf(e)], + style: TextStyle(color: e), + ))) + .toList(); +} \ No newline at end of file diff --git a/lib/views/widgets/StatefulWidget/FormField/node1_base.dart b/lib/views/widgets/StatefulWidget/FormField/node1_base.dart new file mode 100644 index 0000000..dd7fab8 --- /dev/null +++ b/lib/views/widgets/StatefulWidget/FormField/node1_base.dart @@ -0,0 +1,36 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-04-01 +/// contact me by email 1981462002@qq.com +/// 说明: 222 FormField 表单字段 +/// 一个表单字段,需要在 Form 组件中使用,内含泛型 T 的字段作为状态量,对根据字段的更新和验证会触发相应回调。 +/// link:198,199,223, +// { +// "widgetId": 222, +// "name": 'FormField 介绍', +// "priority": 1, +// "subtitle": +// "【builder】 : 内容构造器 【FormFieldBuilder】\n" +// "【initialValue】 : 初始值 【T】\n" +// "【validator】 : 验证函数 【FormFieldValidator 】\n" +// "【enabled】 : 是否有效 【bool】\n" +// "【onSaved】 : 表单save时回调 【FormFieldSetter】", +// } +class FormFieldDemo extends StatelessWidget { + final String info = + 'FormField 代表表单中的一个字段,对于字符串类型的字段,框架中封装了 TextFormField 以便使用;下拉选择的字段,用 DropdownButtonFormField。' + '目前框架中 FormField 的子类也只有这两个。既然是表单字段,必然是要和 Form 组件一起使用。通过对 Form 添加 GlobalKey ,来获取 FormState 对象。' + '当 FormState 调用 save 方法时,所有的 FormField 都会触发 onSave 方法,当 FormState 调用 validate 方法时,所有的 FormField 都会触发 validate 方法。'; + + @override + Widget build(BuildContext context) { + + + return Container( + color: Colors.blue.withOpacity(0.1), + padding: EdgeInsets.all(10), + margin: EdgeInsets.all(10), + child: Text(info), + ); + } +} diff --git a/lib/views/widgets/StatefulWidget/PaginatedDataTable/node1_base.dart b/lib/views/widgets/StatefulWidget/PaginatedDataTable/node1_base.dart new file mode 100644 index 0000000..2d56de2 --- /dev/null +++ b/lib/views/widgets/StatefulWidget/PaginatedDataTable/node1_base.dart @@ -0,0 +1,214 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-04-01 +/// contact me by email 1981462002@qq.com +/// 说明: 235 PaginatedDataTable 可分页表格 +/// 一个功能丰富的可分页表格组件,可指定分页数、排列、页码前后切换。 +/// link: 110,102 +// { +// "widgetId": 235 , +// "name": 'PaginatedDataTable 使用', +// "priority": 1, +// "subtitle": +// "【header】 : 表名 【Widget】\n" +// "【rowsPerPage】 : 每页记录数 【int】\n" +// "【actions】 : 操作组件 【List】\n" +// "【columns】 : 数据列 【List】\n" +// "【sortColumnIndex】 : 排序列索引 【int】\n" +// "【sortAscending】 : 是否升序 【bool】\n" +// "【onSelectAll】 : 全选回调 【ValueSetter】\n" +// "【onRowsPerPageChanged】 : 分页改变监听 【ValueChanged】\n" +// "【availableRowsPerPage】 : 可用分页列表 【List】\n" +// "【source】 : 数据源 【DataTableSource】", +// } +class PaginatedDataTableDemo extends StatefulWidget { + @override + State createState() => _PaginatedDataTableDemoState(); +} + +class _PaginatedDataTableDemoState extends State { + int _rowsPerPage = 5; + + int _sortColumnIndex; + bool _sortAscending = true; + + final DessertDataSource _dessertsDataSource = DessertDataSource(); + + void sort( + Comparable getField(HeroInfo d), int columnIndex, bool ascending) { + _dessertsDataSource.sort(getField, ascending); + setState(() { + _sortColumnIndex = columnIndex; + _sortAscending = ascending; + }); + } + + @override + Widget build(BuildContext context) { + return Container( + height: 300, + width: 350, + child: SingleChildScrollView( + child: PaginatedDataTable( + actions: [ + IconButton(icon: Icon(Icons.add), onPressed: null), + ], + header: const Text( + '《旷古奇书》-角色预设', + style: TextStyle(color: Colors.blue), + ), + rowsPerPage: _rowsPerPage, + availableRowsPerPage: [5, 8, 10, 15], + onRowsPerPageChanged: (int value) { + setState(() { + _rowsPerPage = value; + }); + }, + sortColumnIndex: _sortColumnIndex, + sortAscending: _sortAscending, + onSelectAll: _dessertsDataSource._selectAll, + columns: [ + DataColumn( + label: const Text('角色名称'), + onSort: (int columnIndex, bool ascending) => sort( + (HeroInfo d) => d.name, columnIndex, ascending)), + DataColumn( + label: const Text('主场卷部'), + tooltip: '人物主要出场的作品.', + numeric: true, + onSort: (int columnIndex, bool ascending) => sort( + (HeroInfo d) => d.calories, columnIndex, ascending)), + DataColumn( + label: const Text('种族'), + numeric: true, + onSort: (int columnIndex, bool ascending) => sort( + (HeroInfo d) => d.fat, columnIndex, ascending)), + DataColumn( + label: const Text('性别'), + numeric: true, + onSort: (int columnIndex, bool ascending) => sort( + (HeroInfo d) => d.carbs, columnIndex, ascending)), + ], + source: _dessertsDataSource), + )); + } +} + +class HeroInfo { + HeroInfo(this.name, this.calories, this.fat, this.carbs); + + final String name; + final String calories; + final String fat; + final String carbs; + bool selected = false; +} + +class DessertDataSource extends DataTableSource { + final List _desserts = [ + HeroInfo('捷特', '《幻将录》', "人族", "男"), + HeroInfo('龙少', '《幻将录》', "人族", "男"), + HeroInfo('巫缨', '《幻将录》', "人族", "女"), + HeroInfo('林兮', '《幻将录》', "人族", "男"), + HeroInfo('九方玄玉', '《风神传》', "神族", "男"), + HeroInfo('七日洪荒', '《风神传》', "魔族", "男"), + HeroInfo('林昔瑶', '《封妖志》', "鬼族", "女"), + HeroInfo('林兮鬼帝', '《封妖志》', "鬼族", "男"), + HeroInfo('艾隆', '《封妖志》', "鬼族", "男"), + HeroInfo('语熙华', '《风神传》', "道族", "男"), + HeroInfo('雪玉宛如', '《幻将录》', "人族", "女"), + HeroInfo('破千', '《幻将录》', "人族", "男"), + HeroInfo('浪封', '《幻将录》', "人族", "男"), + HeroInfo('虎翼穷奇', '《封妖志》', "妖族", "男"), + HeroInfo('凯', '《幻将录》', "人族", "男"), + HeroInfo('荆棘', '《幻将录》', "人族", "女"), + HeroInfo('龙右', '《幻将录》', "人族", "男"), + HeroInfo('梦千', '《幻将录》', "人族", "男"), + HeroInfo('梦小梦', '《幻将录》', "人族", "女"), + HeroInfo('梦瞳', '《幻将录》', "人族", "男"), + HeroInfo('十戈', '《幻将录》', "人族", "男"), + HeroInfo('计画天', '《幻将录》', "人族", "女"), + HeroInfo('士方', '《幻将录》', "人族", "男"), + HeroInfo('巫妻孋', '《幻将录》', "人族", "女"), + HeroInfo('木时黎', '《永恒传说》', "人族", "男"), + HeroInfo('木艾奇', '《永恒传说》', "人族", "男"), + HeroInfo('张风', '《永恒传说》', "人族", "男"), + HeroInfo('薛剑儿', '《永恒传说》', "人族", "男"), + HeroInfo('李月', '《永恒传说》', "人族", "女"), + HeroInfo('刘雪', '《永恒传说》', "人族", "女"), + HeroInfo('葛心', '《永恒传说》', "人族", "女"), + HeroInfo('步映容', '《幻将录》', "人族", "女"), + HeroInfo('莫慈良', '《幻将录》', "人族", "男"), + HeroInfo('莫向阳', '《幻将录》', "人族", "男"), + HeroInfo('莫子薇', '《永恒传说》', "人族", "女"), + HeroInfo('藏凯阳', '《永恒传说》', "人族", "男"), + HeroInfo('奇雨歆', '《永恒传说》', "人族", "女"), + HeroInfo('林天蕊', '《永恒传说》', "人族", "女"), + HeroInfo('吴灏然', '《永恒传说》', "人族", "男"), + HeroInfo('何解连', '《永恒传说》', "人族", "男"), + HeroInfo('步络尘', '《幻将录》', "人族", "男"), + HeroInfo('拓雷', '《幻将录》', "人族", "男"), + HeroInfo('炽阳骑', '《幻将录》', "人族", "男"), + HeroInfo('正构', '《幻将录》', "人族", "男"), + HeroInfo('烈', '《幻将录》', "人族", "男"), + HeroInfo('梦华君', '《幻将录》', "人族", "男"), + HeroInfo('初星', '《幻将录》', "人族", "男"), + HeroInfo('梦飞烟', '《幻将录》', "人族", "男"), + HeroInfo('武落英', '《幻将录》', "人族", "女"), + HeroInfo('古千缘', '《幻将录》', "人族", "男"), + ]; + + void sort(Comparable getField(HeroInfo d), bool ascending) { + _desserts.sort((HeroInfo a, HeroInfo b) { + if (!ascending) { + final HeroInfo c = a; + a = b; + b = c; + } + final Comparable aValue = getField(a); + final Comparable bValue = getField(b); + return Comparable.compare(aValue, bValue); + }); + notifyListeners(); + } + + int _selectedCount = 0; + + @override + DataRow getRow(int index) { + if (index >= _desserts.length) return null; + final HeroInfo dessert = _desserts[index]; + return DataRow.byIndex( + index: index, + selected: dessert.selected, + onSelectChanged: (bool value) { + if (dessert.selected != value) { + _selectedCount += value ? 1 : -1; + assert(_selectedCount >= 0); + dessert.selected = value; + notifyListeners(); + } + }, + cells: [ + DataCell(Center(child: Text('${dessert.name}'))), + DataCell(Center(child: Text('${dessert.calories}'))), + DataCell(Center(child: Text('${dessert.fat}'))), + DataCell(Center(child: Text('${dessert.carbs}'))), + ]); + } + + @override + bool get isRowCountApproximate => false; + + @override + int get rowCount => _desserts.length; + + @override + int get selectedRowCount => _selectedCount; + + void _selectAll(bool checked) { + for (HeroInfo dessert in _desserts) dessert.selected = checked; + _selectedCount = checked ? _desserts.length : 0; + notifyListeners(); + } +} diff --git a/lib/views/widgets/StatefulWidget/TextFormField/node1_base.dart b/lib/views/widgets/StatefulWidget/TextFormField/node1_base.dart index 97d1f02..2605f83 100644 --- a/lib/views/widgets/StatefulWidget/TextFormField/node1_base.dart +++ b/lib/views/widgets/StatefulWidget/TextFormField/node1_base.dart @@ -23,37 +23,23 @@ class _CustomTextFormFieldState extends State { @override Widget build(BuildContext context) { - return Container( - child: Form( - key: _formKey, - child: - Stack( - alignment: Alignment.centerRight, - children: [ - Container( - width: 350, - child: UnconstrainedBox( - child: Container( - width: 200, - height: 70, - child: TextFormField( - style: TextStyle(textBaseline: TextBaseline.alphabetic), - decoration: InputDecoration( - border: OutlineInputBorder(), - labelText: 'username', - ), - validator: _validateUsername, - onFieldSubmitted: _onFieldSubmitted, - onSaved: _onSaved, - ), - ), - ), + return Row( + children: [ + SizedBox(width: 40), + Expanded( + child: TextFormField( + style: TextStyle(textBaseline: TextBaseline.alphabetic), + decoration: InputDecoration( + border: OutlineInputBorder(), + labelText: 'username', ), - Positioned( - top: 0, right: 0, child: _buildSubmitButton(context)), - ], + validator: _validateUsername, + onFieldSubmitted: _onFieldSubmitted, + onSaved: _onSaved, + ), ), - ), + _buildSubmitButton(context), + ], ); } diff --git a/lib/views/widgets/StatelessWidget/ModalBarrier/node1_base.dart b/lib/views/widgets/StatelessWidget/ModalBarrier/node1_base.dart new file mode 100644 index 0000000..8f5f2cd --- /dev/null +++ b/lib/views/widgets/StatelessWidget/ModalBarrier/node1_base.dart @@ -0,0 +1,32 @@ +import 'package:flutter/material.dart'; + +/// create by 张风捷特烈 on 2020-04-01 +/// contact me by email 1981462002@qq.com +/// 说明: 212 ModalBarrier 屏障模 +/// 相当于一块幕布,防止用户与其背后的 Widget 交互,可以通过 dismissible 决定点击时,是否触发返回栈。源码中用于 Dialog 相关组件。 +/// link: 227,126,127,128 +// { +// "widgetId": 212, +// "name": 'ModalBarrier 介绍', +// "priority": 1, +// "subtitle": +// "【dismissible】 : 点击是否返回 【bool】\n" +// "【color】 : 颜色 【Color】", +// } +class ModalBarrierDemo extends StatelessWidget { + + @override + Widget build(BuildContext context) { + return Container( + width: 200, + height: 100, + child: Stack(alignment: Alignment.center, children: [ + ModalBarrier( + dismissible: true, + color: Colors.grey.withOpacity(0.3), + ), + Text('点击背景返回') + ]), + ); + } +} diff --git a/lib/views/widgets/exp/proxy_unit.dart b/lib/views/widgets/exp/proxy_unit.dart index 966f268..95e2fa2 100644 --- a/lib/views/widgets/exp/proxy_unit.dart +++ b/lib/views/widgets/exp/proxy_unit.dart @@ -30,3 +30,5 @@ export '../ProxyWidget/TableCell/node1_base.dart'; export '../ProxyWidget/KeepAlive/node1_base.dart'; export '../ProxyWidget/CupertinoUserInterfaceLevel/node1_base.dart'; export '../ProxyWidget/InheritedTheme/node1_base.dart'; +export '../ProxyWidget/DefaultAssetBundle/node1_base.dart'; +export '../ProxyWidget/InheritedWidget/node1_base.dart'; diff --git a/lib/views/widgets/exp/stateful_unit.dart b/lib/views/widgets/exp/stateful_unit.dart index dab2858..a1af721 100644 --- a/lib/views/widgets/exp/stateful_unit.dart +++ b/lib/views/widgets/exp/stateful_unit.dart @@ -78,8 +78,11 @@ export '../StatefulWidget/RawGestureDetector/node1_base.dart'; export '../StatefulWidget/Dismissible/node1_base.dart'; export '../StatefulWidget/AutomaticKeepAlive/node1_base.dart'; +export '../StatefulWidget/AnimatedModalBarrier/node1_base.dart'; +export '../StatefulWidget/FormField/node1_base.dart'; export '../StatefulWidget/AnimatedBuilder/node1_base.dart'; export '../StatefulWidget/TweenAnimationBuilder/node1_base.dart'; +export '../StatefulWidget/PaginatedDataTable/node1_base.dart'; export '../StatefulWidget/RawKeyboardListener/node1_base.dart'; export '../StatefulWidget/Dismissible/node2_direction.dart'; @@ -100,6 +103,7 @@ export '../StatefulWidget/AnimatedPositioned/node1_base.dart'; export '../StatefulWidget/AnimatedPositionedDirectional/node1_base.dart'; export '../StatefulWidget/ExpansionPanelList/node1_base.dart'; +export '../StatefulWidget/DropdownButtonFormField/node1_base.dart'; export '../StatefulWidget/Ink/node1_base.dart'; export '../StatefulWidget/Ink/node2_image.dart'; diff --git a/lib/views/widgets/exp/stateless_unit.dart b/lib/views/widgets/exp/stateless_unit.dart index 48b195c..d975f95 100644 --- a/lib/views/widgets/exp/stateless_unit.dart +++ b/lib/views/widgets/exp/stateless_unit.dart @@ -50,6 +50,7 @@ export '../StatelessWidget/Divider/node1_base.dart'; export '../StatelessWidget/Divider/node2_height.dart'; export '../StatelessWidget/ScrollView/node1_base.dart'; +export '../StatelessWidget/ModalBarrier/node1_base.dart'; export '../StatelessWidget/BoxScrollView/node1_base.dart'; export '../StatelessWidget/FloatingActionButton/node1_base.dart'; export '../StatelessWidget/FloatingActionButton/node2_mini.dart'; diff --git a/lib/views/widgets/widgets_map.dart b/lib/views/widgets/widgets_map.dart index c59549f..ee6cf15 100644 --- a/lib/views/widgets/widgets_map.dart +++ b/lib/views/widgets/widgets_map.dart @@ -83,6 +83,34 @@ class WidgetsMap { return [ InheritedThemeDemo(), ]; + case "ModalBarrier": + return [ + ModalBarrierDemo(), + ]; + case "AnimatedModalBarrier": + return [ + AnimatedModalBarrierDemo(), + ]; + case "DefaultAssetBundle": + return [ + DefaultAssetBundleDemo(), + ]; + case "DropdownButtonFormField": + return [ + DropdownButtonFormFieldDemo(), + ]; + case "FormField": + return [ + FormFieldDemo(), + ]; + case "PaginatedDataTable": + return [ + PaginatedDataTableDemo(), + ]; + case "InheritedWidget": + return [ + InheritedWidgetDemo(), + ]; case "ScrollView": return [ ScrollViewDemo(),