diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png index db77bb4..f050d16 100644 Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-ldpi/ic_launcher.png b/android/app/src/main/res/mipmap-ldpi/ic_launcher.png new file mode 100644 index 0000000..791a270 Binary files /dev/null and b/android/app/src/main/res/mipmap-ldpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png index 17987b7..e905d2f 100644 Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png index 09d4391..3a3ba49 100644 Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index d5f1c8d..b01ce08 100644 Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 4d6372e..21e1458 100644 Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/playstore-icon.png b/android/app/src/main/res/playstore-icon.png new file mode 100644 index 0000000..f9bca41 Binary files /dev/null and b/android/app/src/main/res/playstore-icon.png differ diff --git a/assets/imgs/avatar.png b/assets/imgs/avatar.png new file mode 100644 index 0000000..6072464 Binary files /dev/null and b/assets/imgs/avatar.png differ diff --git a/docs/widget/form/daypicker/index.md b/docs/widget/form/daypicker/index.md index 068d575..3b072c7 100644 --- a/docs/widget/form/daypicker/index.md +++ b/docs/widget/form/daypicker/index.md @@ -1 +1,35 @@ -## **文档完善中** +## **DatePicker** + +> +显示给定月份的日期并允许选择一天 +* 日期选择器很少直接使用,请考虑使用 showDatePicker 或者 showTimePicker,它会创建一个日期/时间选择器对话框 + +### showDatePicker构造方法 +``` dart +showDatePicker({ + @required BuildContext context, + @required DateTime initialDate, + @required DateTime firstDate, + @required DateTime lastDate, + SelectableDayPredicate selectableDayPredicate, + DatePickerMode initialDatePickerMode = DatePickerMode.day, + Locale locale, + TextDirection textDirection, + TransitionBuilder builder, +}) +``` + +### showTimePicker构造方法 +``` dart +showTimePicker({ + @required BuildContext context, + @required TimeOfDay initialTime, + TransitionBuilder builder, +}) +``` + +### 属性介绍 +* context: 上下文 +* initialDate: 初始时间 +* firstDate: 设置选择的最早时间 +* lastDate: 设置选择的最晚时间 diff --git a/docs/widget/form/radio/index.md b/docs/widget/form/radio/index.md index 068d575..a980660 100644 --- a/docs/widget/form/radio/index.md +++ b/docs/widget/form/radio/index.md @@ -1 +1,22 @@ -## **文档完善中** +## **Radio** + +> +单选按钮 + +### 构造方法 +``` dart +Radio({ + Key key, + @required this.value, + @required this.groupValue, + @required this.onChanged, + this.activeColor, + this.materialTapTargetSize, +}) +``` + +### 属性介绍 +* value:单选按钮的值 +* groupValue:此组单选按钮的当前选定值,当value=groupValue时表示该按钮被选中 +* onChanged:选择单选按钮时的回调 +* activeColor:选中该按钮的颜色 \ No newline at end of file diff --git a/docs/widget/form/radiolisttile/index.md b/docs/widget/form/radiolisttile/index.md new file mode 100644 index 0000000..15f8e1d --- /dev/null +++ b/docs/widget/form/radiolisttile/index.md @@ -0,0 +1,35 @@ +## **RadioListTile** + +> +带标签的单选按钮 + +### 构造方法 +``` dart +RadioListTile({ + Key key, + @required this.value, + @required this.groupValue, + @required this.onChanged, + this.activeColor, + this.title, + this.subtitle, + this.isThreeLine = false, + this.dense, + this.secondary, + this.selected = false, + this.controlAffinity = ListTileControlAffinity.platform, + }) +``` + +### 属性介绍 +* value:单选按钮的值 +* groupValue:此组单选按钮的当前选定值,当value=groupValue时表示该按钮被选中 +* onChanged:选择单选按钮时的回调 +* activeColor:选中该按钮的颜色 +* title: 标题 +* subtitle: 子标题 +* isThreeLine: 是否显示三行文本 +* dense: 是否垂直密集显示 +* secondary: 显示单选按钮一侧的小组件 +* selected: 是否使用activeColor渲染图标和文本 +* controlAffinity: 相对于文本放置控件位置 \ No newline at end of file diff --git a/docs/widget/form/switch/index.md b/docs/widget/form/switch/index.md index 068d575..2d767a9 100644 --- a/docs/widget/form/switch/index.md +++ b/docs/widget/form/switch/index.md @@ -1 +1,33 @@ -## **文档完善中** +## **Switch** + +> +Switch是切换按钮控件,通常用于设置的选项里 + +### 构造方法 +``` dart +Switch({ + Key key, + @required this.value, + @required this.onChanged, + this.activeColor, + this.activeTrackColor, + this.inactiveThumbColor, + this.inactiveTrackColor, + this.activeThumbImage, + this.inactiveThumbImage, + this.materialTapTargetSize, + this.dragStartBehavior = DragStartBehavior.start, +}) +``` + +### 属性介绍 +* value: true:开 false:关 +* onChanged: 变化时回调 +* activeColor: 打开状态下颜色 +* activeTrackColor: 打开状态下track颜色 +* inactiveThumbColor: 关闭状态thumb颜色 +* inactiveTrackColor: 关闭状态track颜色 +* activeThumbImage: 打开状态下thumb图片 +* inactiveThumbImage: 关闭状态thumb图片 +* materialTapTargetSize: 配置点击目标的最小尺寸 +* dragStartBehavior: 确定处理拖动开始行为的方式 \ No newline at end of file diff --git a/docs/widget/form/switchlisttile/index.md b/docs/widget/form/switchlisttile/index.md new file mode 100644 index 0000000..91f2758 --- /dev/null +++ b/docs/widget/form/switchlisttile/index.md @@ -0,0 +1,41 @@ +## **SwitchListTile** + +> +带有标签的开关 + +### 构造方法 +``` dart +SwitchListTile({ + Key key, + @required this.value, + @required this.onChanged, + this.activeColor, + this.activeTrackColor, + this.inactiveThumbColor, + this.inactiveTrackColor, + this.activeThumbImage, + this.inactiveThumbImage, + this.title, + this.subtitle, + this.isThreeLine = false, + this.dense, + this.secondary, + this.selected = false, +}) +``` + +### 属性介绍 +* value: true:开 false:关 +* onChanged: 变化时回调 +* activeColor: 打开状态下颜色 +* activeTrackColor: 打开状态下track颜色 +* inactiveThumbColor: 关闭状态thumb颜色 +* inactiveTrackColor: 关闭状态track颜色 +* activeThumbImage: 打开状态下thumb图片 +* inactiveThumbImage: 关闭状态thumb图片 +* title: 标题 +* subtitle: 子标题 +* isThreeLine: 是否显示三行文本 +* dense: 是否垂直密集显示 +* secondary: 显示左侧侧的小组件 +* selected: 是否使用activeColor渲染图标和文本 diff --git a/docs/widget/form/textfield/index.md b/docs/widget/form/textfield/index.md index 068d575..f9e026d 100644 --- a/docs/widget/form/textfield/index.md +++ b/docs/widget/form/textfield/index.md @@ -1 +1,64 @@ -## **文档完善中** +## **TextField** + +> +TextField最常用的文本输入Widget + + +### 构造方法 +``` dart +TextField({ + Key key, + this.controller, + this.focusNode, + this.decoration = const InputDecoration(), + TextInputType keyboardType, + this.textInputAction, + this.textCapitalization = TextCapitalization.none, + this.style, + this.strutStyle, + this.textAlign = TextAlign.start, + this.textDirection, + this.autofocus = false, + this.obscureText = false, + this.autocorrect = true, + this.maxLines = 1, + this.maxLength, + this.maxLengthEnforced = true, + this.onChanged, + this.onEditingComplete, + this.onSubmitted, + this.inputFormatters, + this.enabled, + this.cursorWidth = 2.0, + this.cursorRadius, + this.cursorColor, + this.keyboardAppearance, + this.scrollPadding = const EdgeInsets.all(20.0), + this.dragStartBehavior = DragStartBehavior.start, + this.enableInteractiveSelection, + this.onTap, + this.buildCounter, +}) +``` + +### 属性介绍 +* controller:TextField的控制器,可用来添加通知或者获取TextField的值,如controller.text +* decoration = const InputDecoration():装饰器,设置相关的属性能构造出各种TextField效果,详情见Demo +* TextInputType keyboardType:TextField获得焦点时弹出的键盘类型 +* style:输入框文本样式 +* textAlign:文本对齐方式 +* textDirection:文本方向 +* autofocus:是否自动对焦 +* obscureText:是否以密码形式显示 +* autocorrect:是否自动更正 +* maxLines:最大行数 +* maxLength:最大长度,设置此项会让TextField右下角有一个输入数量的统计字符串 +* maxLengthEnforced = true: +* onChanged:输入框内容改变进行回调 +* onEditingComplete:输入完毕回调 +* onSubmitted:内容提交,回车的回调 +* enabled:是否禁用 +* cursorWidth = 2.0:光标的宽度 +* cursorRadius:光标的角的圆角 +* cursorColor:光标的颜色 +* onTap:点击文本时调用 \ No newline at end of file diff --git a/docs/widget/navigator/appbar/index.md b/docs/widget/navigator/appbar/index.md index 74e1a06..e9fe716 100644 --- a/docs/widget/navigator/appbar/index.md +++ b/docs/widget/navigator/appbar/index.md @@ -1 +1,32 @@ -## **AppBar** \ No newline at end of file +## **AppBar** +> 创建导航栏, + +### 构造函数 +``` +AppBar({ + Key key, + Widget leading, + bool automaticallyImplyLeading: true, + Widget title, + List actions, + Widget flexibleSpace, + PreferredSizeWidget bottom, + double elevation, + Color backgroundColor, + Brightness brightness, + IconThemeData iconTheme, + TextTheme textTheme, + bool primary: true, + bool centerTitle, + double titleSpacing: NavigationToolbar.kMiddleSpacing, + double toolbarOpacity: 1.0, + double bottomOpacity: 1.0 +}) +``` + +### 属性介绍 +- leading: 导航栏左侧图标 +- title: 导航栏标题 +- actions: 导航栏右侧扩展图标,可添加PopupMenuButton,点开有下拉展开更多按钮。 +- automaticallyImplyLeading: 默认true, 当有上一级页面时,默认显示back按钮 +- bottom: 通过与Tabbar使用 \ No newline at end of file diff --git a/docs/widget/navigator/drawer/index.md b/docs/widget/navigator/drawer/index.md index 83532f6..f960513 100644 --- a/docs/widget/navigator/drawer/index.md +++ b/docs/widget/navigator/drawer/index.md @@ -1 +1,50 @@ -## **文档完善中** \ No newline at end of file +## **Drawer** +> 抽屉式组件,从Scaffold边缘水平滑出左侧菜单,也可通过Scaffold.of(context).openDrawer()显示左侧菜单。关闭页面通过Navigator.pop(context)。 + +### 构造函数 +``` +Drawer({ + Key key, + double elevation: 16.0, + Widget child, + String semanticLabel +}) +``` + +### 属性介绍 +- child: 菜单内容 +- elevation:导航栏底部阴影 + +### 高级用法 +- 关闭菜单 +> Navigator.pop(context) +- 打开菜单 +> 方法一: Scaffold.of(context).openDrawer() +``` +使用context变量时,需要注意在scaffold中增加Builder来获取到context,该context才是scaffold中的上下文对象,而Build build(BuildContext context)是外层类的上下文,没法操作菜单 +Builder( + builder: (context) { + return RaisedButton( + onPressed: () { + Scaffold.of(context).openDrawer(); + }, + child: Text("点击滑出左侧菜单"), + ); + }, +), +``` + +> 方法二: static GlobalKey _globalKey= new GlobalKey(); +``` +定义globalKey + +static GlobalKey _globalKey= new GlobalKey(); +... +Scaffold( + key: _globalKey , //设置key + ... +) + +通过globalkey操作菜单状态 +_globalKey.currentState.openDrawer() +``` diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json index d36b1fa..99f7a0c 100644 --- a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,122 +1,128 @@ { - "images" : [ - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-App-20x20@2x.png", - "scale" : "2x" - }, - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-App-20x20@3x.png", - "scale" : "3x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@3x.png", - "scale" : "3x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-App-40x40@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-App-40x40@3x.png", - "scale" : "3x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-App-60x60@2x.png", - "scale" : "2x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-App-60x60@3x.png", - "scale" : "3x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@1x.png", - "scale" : "1x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-App-40x40@1x.png", - "scale" : "1x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-App-40x40@2x.png", - "scale" : "2x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-App-76x76@1x.png", - "scale" : "1x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-App-76x76@2x.png", - "scale" : "2x" - }, - { - "size" : "83.5x83.5", - "idiom" : "ipad", - "filename" : "Icon-App-83.5x83.5@2x.png", - "scale" : "2x" - }, - { - "size" : "1024x1024", - "idiom" : "ios-marketing", - "filename" : "Icon-App-1024x1024@1x.png", - "scale" : "1x" + "images":[ + { + "idiom":"iphone", + "size":"20x20", + "scale":"2x", + "filename":"Icon-App-20x20@2x.png" + }, + { + "idiom":"iphone", + "size":"20x20", + "scale":"3x", + "filename":"Icon-App-20x20@3x.png" + }, + { + "idiom":"iphone", + "size":"29x29", + "scale":"1x", + "filename":"Icon-App-29x29@1x.png" + }, + { + "idiom":"iphone", + "size":"29x29", + "scale":"2x", + "filename":"Icon-App-29x29@2x.png" + }, + { + "idiom":"iphone", + "size":"29x29", + "scale":"3x", + "filename":"Icon-App-29x29@3x.png" + }, + { + "idiom":"iphone", + "size":"40x40", + "scale":"2x", + "filename":"Icon-App-40x40@2x.png" + }, + { + "idiom":"iphone", + "size":"40x40", + "scale":"3x", + "filename":"Icon-App-40x40@3x.png" + }, + { + "idiom":"iphone", + "size":"60x60", + "scale":"2x", + "filename":"Icon-App-60x60@2x.png" + }, + { + "idiom":"iphone", + "size":"60x60", + "scale":"3x", + "filename":"Icon-App-60x60@3x.png" + }, + { + "idiom":"iphone", + "size":"76x76", + "scale":"2x", + "filename":"Icon-App-76x76@2x.png" + }, + { + "idiom":"ipad", + "size":"20x20", + "scale":"1x", + "filename":"Icon-App-20x20@1x.png" + }, + { + "idiom":"ipad", + "size":"20x20", + "scale":"2x", + "filename":"Icon-App-20x20@2x.png" + }, + { + "idiom":"ipad", + "size":"29x29", + "scale":"1x", + "filename":"Icon-App-29x29@1x.png" + }, + { + "idiom":"ipad", + "size":"29x29", + "scale":"2x", + "filename":"Icon-App-29x29@2x.png" + }, + { + "idiom":"ipad", + "size":"40x40", + "scale":"1x", + "filename":"Icon-App-40x40@1x.png" + }, + { + "idiom":"ipad", + "size":"40x40", + "scale":"2x", + "filename":"Icon-App-40x40@2x.png" + }, + { + "idiom":"ipad", + "size":"76x76", + "scale":"1x", + "filename":"Icon-App-76x76@1x.png" + }, + { + "idiom":"ipad", + "size":"76x76", + "scale":"2x", + "filename":"Icon-App-76x76@2x.png" + }, + { + "idiom":"ipad", + "size":"83.5x83.5", + "scale":"2x", + "filename":"Icon-App-83.5x83.5@2x.png" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "scale" : "1x", + "filename" : "ItunesArtwork@2x.png" + } + ], + "info":{ + "version":1, + "author":"makeappicon" } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } } diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png index 28c6bf0..481a5f9 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png index 2ccbfd9..ea5df0f 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png index f091b6b..51f7489 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png index 4cde121..d72f772 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png index d0ef06e..7d94ac1 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png index dcdc230..ad4f2b9 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png index 2ccbfd9..ea5df0f 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png index c8f9ed8..13857ba 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png index a6d6b86..d233792 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png index a6d6b86..d233792 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png index 75b2d16..da3e33d 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png index c4df70d..1671d1b 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png index 6a84f41..b6fff7c 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png index d0e1f58..a14e240 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png new file mode 100644 index 0000000..91a244c Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png differ diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/iTunesArtwork@1x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/iTunesArtwork@1x.png new file mode 100644 index 0000000..f9bca41 Binary files /dev/null and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/iTunesArtwork@1x.png differ diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/iTunesArtwork@2x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/iTunesArtwork@2x.png new file mode 100644 index 0000000..91a244c Binary files /dev/null and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/iTunesArtwork@2x.png differ diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/iTunesArtwork@3x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/iTunesArtwork@3x.png new file mode 100644 index 0000000..683fd14 Binary files /dev/null and b/ios/Runner/Assets.xcassets/LaunchImage.imageset/iTunesArtwork@3x.png differ diff --git a/lib/components/baseComp.dart b/lib/components/baseComp.dart index d113981..95c55b0 100644 --- a/lib/components/baseComp.dart +++ b/lib/components/baseComp.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:efox_flutter/store/index.dart' show Store; -import 'header.dart' as Header; +import 'headerComp.dart' as Header; class Index extends StatelessWidget { final dynamic child; diff --git a/lib/components/exampleComp.dart b/lib/components/exampleComp.dart index 2794048..37b53f7 100644 --- a/lib/components/exampleComp.dart +++ b/lib/components/exampleComp.dart @@ -12,12 +12,12 @@ class Index extends StatelessWidget { @override Widget build(BuildContext context) { Size size = MediaQuery.of(context).size; - double _dp = 1.4; + double _dp = 1.5; return Store.connect( builder: (context, child, MainStateModel model) { return Center( child: Container( - width: size.width / _dp, + width: size.width, height: size.height / _dp, margin: EdgeInsets.all(30 / _dp), decoration: BoxDecoration( diff --git a/lib/components/header.dart b/lib/components/headerComp.dart similarity index 100% rename from lib/components/header.dart rename to lib/components/headerComp.dart diff --git a/lib/components/updatingComp.dart b/lib/components/updatingComp.dart new file mode 100644 index 0000000..f7e9258 --- /dev/null +++ b/lib/components/updatingComp.dart @@ -0,0 +1,24 @@ +import 'package:flutter/material.dart'; + +class Index extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Container( + width: double.infinity, + margin: EdgeInsets.only(top: 100.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + '等待更新', + style: TextStyle( + fontSize: 20.0, + color: Colors.grey + ), + ) + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/components/webviewComp.dart b/lib/components/webviewComp.dart index d02b88e..499d58d 100644 --- a/lib/components/webviewComp.dart +++ b/lib/components/webviewComp.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'header.dart' as Header; +import 'headerComp.dart' as Header; import 'package:flutter_webview_plugin/flutter_webview_plugin.dart' show FlutterWebviewPlugin, WebviewScaffold; class Index extends StatelessWidget { diff --git a/lib/components/widgetComp.dart b/lib/components/widgetComp.dart index d0bd0bb..b99ac22 100644 --- a/lib/components/widgetComp.dart +++ b/lib/components/widgetComp.dart @@ -1,10 +1,11 @@ import 'package:flutter/material.dart'; import 'package:efox_flutter/store/index.dart' show Store; -import 'header.dart' as Header; +import 'headerComp.dart' as Header; import 'package:efox_flutter/components/markdownComp.dart' as MarkDownComp; import 'package:efox_flutter/lang/index.dart' show AppLocalizations; import 'package:efox_flutter/components/baseComp.dart' as BaseComp; import 'package:efox_flutter/components/exampleComp.dart' as ExampleComp; +import 'package:efox_flutter/components/updatingComp.dart' as UpdatingComp; import 'package:efox_flutter/utils/file.dart' as FileUtils; import 'package:efox_flutter/utils/loadAsset.dart' as LoadAssetUtils; import 'package:efox_flutter/router/index.dart' show FluroRouter; @@ -61,17 +62,19 @@ class IndexState extends State { void init() async { this._bodyList.length = 0; - this + String mdText = await this.getMdFile(this.mdUrl); + print('mdText.length ======================================== ${mdText.length}'); + if (mdText.length> 30) { + this ._bodyList - .add(await MarkDownComp.Index(await this.getMdFile(this.mdUrl))); - - // 增加 - if (this.demoChild != null) { + .add(await MarkDownComp.Index(mdText)); + // demo this.demoChild.forEach((Widget item) { this._bodyList.add(ExampleComp.Index(child: item)); }); + } else { + this._bodyList.add(UpdatingComp.Index()); } - setState(() { this.loading = false; }); @@ -131,7 +134,7 @@ class IndexState extends State { onPressed: () async { FluroRouter.router.navigateTo( context, - '/webview?url=${Uri.encodeComponent(this.originCodeUrl)}', + '/webview?title=${this.title}&url=${Uri.encodeComponent(this.originCodeUrl)}', ); }, ), diff --git a/lib/config/index.dart b/lib/config/index.dart index 08e9168..350fcd5 100644 --- a/lib/config/index.dart +++ b/lib/config/index.dart @@ -1,6 +1,6 @@ import 'development.dart' as Development; import 'production.dart' as Production; -const bool isPro = false; +const bool isPro = true; Object env = isPro ? Production.Config() : Development.Config(); diff --git a/lib/page/component/index.dart b/lib/page/component/index.dart index 1fc16b3..cb42878 100644 --- a/lib/page/component/index.dart +++ b/lib/page/component/index.dart @@ -3,7 +3,7 @@ import 'package:efox_flutter/router/index.dart' show FluroRouter; import 'package:efox_flutter/store/models/main_state_model.dart' show MainStateModel; import 'package:efox_flutter/lang/index.dart' show AppLocalizations; -import 'package:efox_flutter/components/header.dart' as Header; +import 'package:efox_flutter/components/headerComp.dart' as Header; import 'package:efox_flutter/widget/index.dart' as WidgetRoot; import 'package:efox_flutter/config/theme.dart' show AppTheme; @@ -65,6 +65,9 @@ class _IndexState extends State { return Container( // padding: EdgeInsets.all(10), child: ListTile( + onTap: () { + this.tabClick(index); + }, leading: Icon( IconData( widgetsItem.code, @@ -125,6 +128,15 @@ class _IndexState extends State { ); } + tabClick (index) { + if (index == this._isExpandedIndex) { + index = -1; + } + setState(() { + this._isExpandedIndex = index; + }); + } + Widget build(BuildContext context) { // 实例化语言包 return Scaffold( @@ -146,12 +158,7 @@ class _IndexState extends State { }, ), expansionCallback: (index, flag) { - if (flag) { - index = -1; - } - setState(() { - this._isExpandedIndex = index; - }); + this.tabClick(index); }, ), ), diff --git a/lib/page/mine/index.dart b/lib/page/mine/index.dart index 969dfdd..636d2da 100644 --- a/lib/page/mine/index.dart +++ b/lib/page/mine/index.dart @@ -16,18 +16,24 @@ class _IndexState extends State { { 'name': AppLocalizations.$t('common.changeLanguage'), 'icon': 59540, // language + 'index': 0 }, { 'name': AppLocalizations.$t('common.changeVersion') + ' ' + _version, 'icon': 58919, // sync + 'index': 1, + 'show': !widget.model.config.state.isPro }, { 'name': AppLocalizations.$t('common.changeEnvironment'), 'icon': 57539, // import_export + 'index': 2, + 'show': !widget.model.config.state.isPro }, { 'name': AppLocalizations.$t('common.compProgress'), 'icon': 57709, // low_priority + 'index': 3 } ]; } @@ -48,7 +54,7 @@ class _IndexState extends State { case 3: FluroRouter.router.navigateTo( context, - '/webview?url=${Uri.encodeComponent(widget.model.config.state.env.githubWeb)}&title=${AppLocalizations.$t('common.compProgress')}', + '/webview?url=${Uri.encodeComponent(widget.model.config.state.env.githubWeb)}&title=${Uri.encodeComponent(AppLocalizations.$t('common.compProgress'))}', ); break; } @@ -79,6 +85,7 @@ class _IndexState extends State { ]; }, body: Builder(builder: (context) { + List list = this._getList(); return CustomScrollView( slivers: [ // SliverOverlapInjector与SliverOverlapAbsorber是相对成立的, @@ -92,19 +99,24 @@ class _IndexState extends State { SliverList( delegate: SliverChildBuilderDelegate( (context, index) { - return ListTile( - onTap: () { - this.actionsEvent(index); - }, - leading: Icon( - IconData( - this._getList()[index]['icon'], - fontFamily: 'MaterialIcons', - matchTextDirection: true, + dynamic item = list[index]; + if (item['show'] ?? true) { + return ListTile( + onTap: () { + this.actionsEvent(item['index']); + }, + leading: Icon( + IconData( + item['icon'], + fontFamily: 'MaterialIcons', + matchTextDirection: true, + ), ), - ), - title: Text('${this._getList()[index]['name']}'), - ); + title: Text('${item['name']}'), + ); + } else { + return Container(); + } }, childCount: this._getList().length, ), diff --git a/lib/widget/form/daypicker/demo.dart b/lib/widget/form/daypicker/demo.dart index f40a0c0..effce88 100644 --- a/lib/widget/form/daypicker/demo.dart +++ b/lib/widget/form/daypicker/demo.dart @@ -1,4 +1,6 @@ import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'dart:async'; class Index extends StatefulWidget { @override @@ -6,19 +8,67 @@ class Index extends StatefulWidget { } class _IndexState extends State { + + DateTime selectedDate = DateTime.now(); + TimeOfDay selectedTime = TimeOfDay.now(); + @override void initState() { super.initState(); } + Future _selectDate() async{ + final DateTime date = await showDatePicker( + context: context, + initialDate: selectedDate, + firstDate: DateTime(1900), + lastDate: DateTime(2100), + ); + if (date == null) { + return; + } + setState(() { + selectedDate = date; + }); + } + + Future _selectTime() async { + final TimeOfDay time = await showTimePicker( + context: context, + initialTime: selectedTime, + ); + if(time ==null) { + return; + } + setState(() { + selectedTime = time; + }); + } + @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('DayPicker'), ), - body: Center( - child: Text('更新中'), + body: Container( + width: double.infinity, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text('日期选择'), + RaisedButton( + onPressed: _selectDate, + child: Text('${DateFormat.yMd().format(selectedDate)}'), + ), + Text('时间选择'), + RaisedButton( + onPressed: _selectTime, + child: Text('${selectedTime.format(context)}'), + ) + ], + ), ), ); } diff --git a/lib/widget/form/daypicker/index.dart b/lib/widget/form/daypicker/index.dart index 0d5c028..4004052 100644 --- a/lib/widget/form/daypicker/index.dart +++ b/lib/widget/form/daypicker/index.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:efox_flutter/components/widgetComp.dart' as WidgetComp; -// import 'demo.dart' as Demo; +import 'demo.dart' as Demo; class Index extends StatefulWidget { static String title = 'DayPicker'; @@ -19,7 +19,7 @@ class _IndexState extends State { originCodeUrl: Index.originCodeUrl, mdUrl: Index.mdUrl, demoChild: [ - // Demo.Index(), + Demo.Index(), ], ); } diff --git a/lib/widget/form/index.dart b/lib/widget/form/index.dart index e267c1a..4fcfa7d 100644 --- a/lib/widget/form/index.dart +++ b/lib/widget/form/index.dart @@ -2,14 +2,17 @@ import 'package:efox_flutter/store/objects/widget_info.dart'; import 'checkbox/index.dart' as CheckBox; import 'checkboxlisttile/index.dart' as CheckboxListTile; import 'slider/index.dart' as Slider; +import 'switch/index.dart' as switchExample; +import 'switchlisttile/index.dart' as switchListTile; +import 'daypicker/index.dart' as daypicker; +import 'radio/index.dart' as radio; +import 'radiolisttile/index.dart' as radioListTile; import 'textinput/index.dart' as textinput; import 'textfield/index.dart' as textfield; -import 'switch/index.dart' as switchExample; import 'rawkeyboard/index.dart' as rawkeyboard; -import 'radio/index.dart' as radio; import 'formfield/index.dart' as formfield; import 'form/index.dart' as form; -import 'daypicker/index.dart' as daypicker; + const nameSpaces = '/form_'; @@ -29,11 +32,31 @@ List widgets = [ code: 60229, // golf_course title: Slider.Index.title ), + ItemInfo( + widget: switchExample.Index(), + code: 58706, // local_pizza + title: switchExample.Index.title + ), + ItemInfo( + widget: switchListTile.Index(), + code: 57955, // monetization_on + title: switchListTile.Index.title + ), ItemInfo( widget: daypicker.Index(), code: 58345, // gradient title: daypicker.Index.title ), + ItemInfo( + widget: radio.Index(), + code: 58693, // local_florist + title: radio.Index.title + ), + ItemInfo( + widget: radioListTile.Index(), + code: 58371, // monochrome_photos + title: radioListTile.Index.title + ), ItemInfo( widget: form.Index(), code: 59526, // group_work @@ -44,21 +67,11 @@ List widgets = [ code: 60230, // hot_tub title: formfield.Index.title ), - ItemInfo( - widget: radio.Index(), - code: 58693, // local_florist - title: radio.Index.title - ), ItemInfo( widget: rawkeyboard.Index(), code: 58698, // local_laundry_service title: rawkeyboard.Index.title ), - ItemInfo( - widget: switchExample.Index(), - code: 58706, // local_pizza - title: switchExample.Index.title - ), ItemInfo( widget: textfield.Index(), code: 58715, // map diff --git a/lib/widget/form/radio/demo.dart b/lib/widget/form/radio/demo.dart index b0e9f0f..5a73491 100644 --- a/lib/widget/form/radio/demo.dart +++ b/lib/widget/form/radio/demo.dart @@ -6,19 +6,46 @@ class Index extends StatefulWidget { } class _IndexState extends State { + int _radioValue = 0; + @override void initState() { super.initState(); } + void _handleRadioValueChanged (int value) { + setState(() { + _radioValue = value; + }); + } + @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Radio'), ), - body: Center( - child: Text('更新中'), + body: Column( + children: [ + Radio( + value: 0, + groupValue: _radioValue, + onChanged: _handleRadioValueChanged, + activeColor: Theme.of(context).primaryColor, + ), + Radio( + value: 1, + groupValue: _radioValue, + onChanged: _handleRadioValueChanged, + activeColor: Theme.of(context).primaryColor, + ), + Radio( + value: 2, + groupValue: _radioValue, + onChanged: _handleRadioValueChanged, + activeColor: Theme.of(context).primaryColor, + ), + ], ), ); } diff --git a/lib/widget/form/radio/index.dart b/lib/widget/form/radio/index.dart index d8fc401..3d82317 100644 --- a/lib/widget/form/radio/index.dart +++ b/lib/widget/form/radio/index.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:efox_flutter/components/widgetComp.dart' as WidgetComp; -// import 'demo.dart' as Demo; +import 'demo.dart' as Demo; class Index extends StatefulWidget { static String title = 'Radio'; @@ -19,7 +19,7 @@ class _IndexState extends State { originCodeUrl: Index.originCodeUrl, mdUrl: Index.mdUrl, demoChild: [ - // Demo.Index(), + Demo.Index(), ], ); } diff --git a/lib/widget/form/radiolisttile/demo.dart b/lib/widget/form/radiolisttile/demo.dart new file mode 100644 index 0000000..b7acec1 --- /dev/null +++ b/lib/widget/form/radiolisttile/demo.dart @@ -0,0 +1,64 @@ +import 'package:flutter/material.dart'; + +class Index extends StatefulWidget { + @override + State createState() => _IndexState(); +} + +class _IndexState extends State { + int _radioValue = 0; + + @override + void initState() { + super.initState(); + } + + void _handleRadioValueChanged (int value) { + setState(() { + _radioValue = value; + }); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text('RadioListTile'), + ), + body: Column( + children: [ + RadioListTile( + value: 0, + groupValue: _radioValue, + onChanged: _handleRadioValueChanged, + activeColor: Theme.of(context).primaryColor, + title: Text('RadioListTile A'), + subtitle: Text('Description'), + secondary: Icon(Icons.filter_1), + selected: _radioValue == 0, + ), + RadioListTile( + value: 1, + groupValue: _radioValue, + onChanged: _handleRadioValueChanged, + activeColor: Theme.of(context).primaryColor, + title: Text('RadioListTile B'), + subtitle: Text('Description'), + secondary: Icon(Icons.filter_2), + selected: _radioValue == 1, + ), + RadioListTile( + value: 2, + groupValue: _radioValue, + onChanged: _handleRadioValueChanged, + activeColor: Theme.of(context).primaryColor, + title: Text('RadioListTile C'), + subtitle: Text('Description'), + secondary: Icon(Icons.filter_3), + selected: _radioValue == 2, + ), + ], + ), + ); + } +} diff --git a/lib/widget/form/radiolisttile/index.dart b/lib/widget/form/radiolisttile/index.dart new file mode 100644 index 0000000..98069b1 --- /dev/null +++ b/lib/widget/form/radiolisttile/index.dart @@ -0,0 +1,26 @@ +import 'package:flutter/material.dart'; +import 'package:efox_flutter/components/widgetComp.dart' as WidgetComp; +import 'demo.dart' as Demo; + +class Index extends StatefulWidget { + static String title = 'RadioListTile'; + static String mdUrl = 'docs/widget/form/radiolisttile/index.md'; + static String originCodeUrl = 'https://docs.flutter.io/flutter/material/RadioListTile-class.html'; + + @override + _IndexState createState() => new _IndexState(); +} + +class _IndexState extends State { + @override + Widget build(BuildContext context) { + return WidgetComp.Index( + title: Index.title, + originCodeUrl: Index.originCodeUrl, + mdUrl: Index.mdUrl, + demoChild: [ + Demo.Index(), + ], + ); + } +} diff --git a/lib/widget/form/switch/demo.dart b/lib/widget/form/switch/demo.dart index ede5cf3..2305a99 100644 --- a/lib/widget/form/switch/demo.dart +++ b/lib/widget/form/switch/demo.dart @@ -6,6 +6,7 @@ class Index extends StatefulWidget { } class _IndexState extends State { + bool _switchValue = false; @override void initState() { super.initState(); @@ -18,7 +19,20 @@ class _IndexState extends State { title: Text('Switch'), ), body: Center( - child: Text('更新中'), + child: Switch( + value: _switchValue, + onChanged: (value){ + setState(() { + _switchValue = value; + }); + }, + activeColor: Theme.of(context).primaryColor, + activeTrackColor: Theme.of(context).primaryColor.withOpacity(0.3), + inactiveThumbColor: Colors.black87, + inactiveTrackColor: Colors.black12, + activeThumbImage: NetworkImage('http://pic1.win4000.com/wallpaper/2019-02-15/5c664c4b4dc2f.jpg'), + inactiveThumbImage: NetworkImage('http://pic1.win4000.com/wallpaper/2019-02-14/5c651084373de.jpg',), + ), ), ); } diff --git a/lib/widget/form/switch/index.dart b/lib/widget/form/switch/index.dart index ecdf2ef..360663b 100644 --- a/lib/widget/form/switch/index.dart +++ b/lib/widget/form/switch/index.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:efox_flutter/components/widgetComp.dart' as WidgetComp; -// import 'demo.dart' as Demo; +import 'demo.dart' as Demo; class Index extends StatefulWidget { static String title = 'Switch'; @@ -19,7 +19,7 @@ class _IndexState extends State { originCodeUrl: Index.originCodeUrl, mdUrl: Index.mdUrl, demoChild: [ - // Demo.Index(), + Demo.Index(), ], ); } diff --git a/lib/widget/form/switchlisttile/demo.dart b/lib/widget/form/switchlisttile/demo.dart new file mode 100644 index 0000000..30fc997 --- /dev/null +++ b/lib/widget/form/switchlisttile/demo.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; + +class Index extends StatefulWidget { + @override + State createState() => _IndexState(); +} + +class _IndexState extends State { + bool _switchValue = false; + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text('SwitchListTile'), + ), + body: Center( + child: SwitchListTile( + value: _switchValue, + onChanged: (value) { + setState(() { + _switchValue = value; + }); + }, + activeColor: Theme.of(context).primaryColor, + activeTrackColor: Theme.of(context).primaryColor.withOpacity(0.3), + inactiveThumbColor: Colors.black87, + inactiveTrackColor: Colors.black12, + activeThumbImage: NetworkImage('http://pic1.win4000.com/wallpaper/2019-02-15/5c664c4b4dc2f.jpg'), + inactiveThumbImage: NetworkImage('http://pic1.win4000.com/wallpaper/2019-02-14/5c651084373de.jpg',), + title: Text('Switch Item A'), + subtitle: Text('SubTitle'), + isThreeLine: false, + secondary: _switchValue ? Icon(Icons.visibility) : Icon(Icons.visibility_off), + selected: _switchValue, + ) + ), + ); + } +} diff --git a/lib/widget/form/switchlisttile/index.dart b/lib/widget/form/switchlisttile/index.dart new file mode 100644 index 0000000..5d6a06a --- /dev/null +++ b/lib/widget/form/switchlisttile/index.dart @@ -0,0 +1,26 @@ +import 'package:flutter/material.dart'; +import 'package:efox_flutter/components/widgetComp.dart' as WidgetComp; +import 'demo.dart' as Demo; + +class Index extends StatefulWidget { + static String title = 'SwitchListTile'; + static String mdUrl = 'docs/widget/form/switchlisttile/index.md'; + static String originCodeUrl = 'https://docs.flutter.io/flutter/material/SwitchListTile-class.html'; + + @override + _IndexState createState() => new _IndexState(); +} + +class _IndexState extends State { + @override + Widget build(BuildContext context) { + return WidgetComp.Index( + title: Index.title, + originCodeUrl: Index.originCodeUrl, + mdUrl: Index.mdUrl, + demoChild: [ + Demo.Index(), + ], + ); + } +} diff --git a/lib/widget/form/textfield/demo.dart b/lib/widget/form/textfield/demo.dart index be8c1b1..3b93b55 100644 --- a/lib/widget/form/textfield/demo.dart +++ b/lib/widget/form/textfield/demo.dart @@ -6,9 +6,21 @@ class Index extends StatefulWidget { } class _IndexState extends State { + final _textEditingController = TextEditingController(); + + @override + void dispose(){ + super.dispose(); + _textEditingController.dispose(); + } + @override void initState() { super.initState(); + _textEditingController.text = ''; + _textEditingController.addListener(() { + print('input: ${_textEditingController.text}'); + }); } @override @@ -17,9 +29,87 @@ class _IndexState extends State { appBar: AppBar( title: Text('TextField'), ), - body: Center( - child: Text('更新中'), - ), + body: ListView( + children: [ + Container( + padding: EdgeInsets.all(10.0), + child: TextField( + controller: _textEditingController, + maxLength: 20, + maxLines: 1, + obscureText: false, + textAlign: TextAlign.start, + style: TextStyle( + fontSize: 20.0, + color: Theme.of(context).primaryColor + ), + onChanged: (value) { + print('正在输入:$value'); + }, + onSubmitted: (value) { + print('sumbit输入完毕: $value'); + }, + decoration: InputDecoration( + icon: Icon(Icons.subject), + labelText: 'Title', + hintText: 'Enter the post title', + errorText: 'error', + ), + ), + ), + Container( + padding: EdgeInsets.all(10.0), + child: TextField( + controller: _textEditingController, + maxLength: 20, + maxLines: 1, + obscureText: false, + textAlign: TextAlign.start, + style: TextStyle( + fontSize: 20.0, + color: Theme.of(context).primaryColor + ), + keyboardType: TextInputType.phone, + decoration: InputDecoration( + labelText: 'Title', + hintText: 'Enter the post title', + helperText: 'phone', + filled: true, + fillColor: Colors.blue.shade100, + prefixIcon: Icon(Icons.local_airport), + suffixText: 'airport' + ), + ), + ), + Container( + padding: EdgeInsets.all(10.0), + child: TextField( + controller: _textEditingController, + maxLength: 20, + style: TextStyle( + fontSize: 20.0, + color: Theme.of(context).primaryColor + ), + keyboardType: TextInputType.number, + cursorColor: Colors.green, + // cursorRadius: Radius.circular(20), + // cursorWidth: 40, + decoration: InputDecoration( + labelText: 'Title', + hintText: 'Enter the post title', + helperText: 'number', + filled: true, + fillColor: Colors.blue.shade100, + prefixIcon: Icon(Icons.local_airport), + suffixIcon: Icon(Icons.local_drink), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(15.0) + ) + ), + ), + ) + ], + ) ); } } diff --git a/lib/widget/form/textfield/index.dart b/lib/widget/form/textfield/index.dart index 184cf3f..0f7b798 100644 --- a/lib/widget/form/textfield/index.dart +++ b/lib/widget/form/textfield/index.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:efox_flutter/components/widgetComp.dart' as WidgetComp; -// import 'demo.dart' as Demo; +import 'demo.dart' as Demo; class Index extends StatefulWidget { static String title = 'TextField'; @@ -19,7 +19,7 @@ class _IndexState extends State { originCodeUrl: Index.originCodeUrl, mdUrl: Index.mdUrl, demoChild: [ - // Demo.Index(), + Demo.Index(), ], ); } diff --git a/lib/widget/navigator/appbar/demo.dart b/lib/widget/navigator/appbar/demo.dart index c759b8f..e92b35b 100644 --- a/lib/widget/navigator/appbar/demo.dart +++ b/lib/widget/navigator/appbar/demo.dart @@ -19,7 +19,7 @@ class _IndexState extends State { Widget build(BuildContext context) { return Scaffold( appBar: AppBar( - title: Text('My Fancy Dress'), + title: Text('AppBar'), actions: [ IconButton( icon: Icon(Icons.playlist_play), @@ -37,7 +37,10 @@ class _IndexState extends State { onPressed: _repairDress, ), ], - ) + ), + body: Center( + child: Image.network('https://flutter.github.io/assets-for-api-docs/assets/material/app_bar.png', fit: BoxFit.contain,), + ), ); } } \ No newline at end of file diff --git a/lib/widget/navigator/drawer/demo.dart b/lib/widget/navigator/drawer/demo.dart index 182143c..c65b6bf 100644 --- a/lib/widget/navigator/drawer/demo.dart +++ b/lib/widget/navigator/drawer/demo.dart @@ -18,7 +18,70 @@ class _IndexState extends State { title: Text('Drawer'), ), body: Center( - child: Text('更新中'), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Builder( + builder: (context) { + return RaisedButton( + onPressed: () { + Scaffold.of(context).openDrawer(); + }, + child: Text("点击滑出左侧菜单"), + ); + }, + ), + Text('从左侧中滑出菜单组件'), + ], + ), + ), + drawer: Drawer( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.only(top: 38.0), + child: Row( + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: ClipOval( + child: Image.asset( + "assets/imgs/avatar.png", + width: 80, + ), + ), + ), + Text( + "Guest", + style: TextStyle(fontWeight: FontWeight.bold), + ) + ], + ), + ), + Expanded( + child: ListView( + children: [ + ListTile( + leading: Icon(Icons.account_circle), + title: Text('Change Account'), + ), + ListTile( + leading: Icon(Icons.settings), + title: Text('Setting'), + ), + ListTile( + leading: Icon(Icons.close), + title: Text('点击关闭菜单'), + onTap: () { + Navigator.pop(context); + }, + ), + ], + ), + ), + ], + ), ), ); } diff --git a/lib/widget/navigator/drawer/index.dart b/lib/widget/navigator/drawer/index.dart index 4bbae26..2581326 100644 --- a/lib/widget/navigator/drawer/index.dart +++ b/lib/widget/navigator/drawer/index.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:efox_flutter/components/widgetComp.dart' as WidgetComp; -// import 'demo.dart' as Demo; +import 'demo.dart' as Demo; class Index extends StatefulWidget { static String title = 'Drawer'; @@ -19,7 +19,7 @@ class _IndexState extends State { originCodeUrl: Index.originCodeUrl, mdUrl: Index.mdUrl, demoChild: [ - // Demo.Index(), + Demo.Index(), ], ); } diff --git a/lib/widget/navigator/scaffold/demo.dart b/lib/widget/navigator/scaffold/demo.dart index 04b754e..e5173a3 100644 --- a/lib/widget/navigator/scaffold/demo.dart +++ b/lib/widget/navigator/scaffold/demo.dart @@ -19,7 +19,7 @@ class _IndexState extends State { bottomNavigationBar: BottomAppBar( child: Container(height: 50.0,), ), - bottomSheet: Text( 'bottomSheet123123'), + bottomSheet: Text( 'bottomSheet'), floatingActionButton: FloatingActionButton( onPressed: () => setState(() { _count++; diff --git a/lib/widget/scrollview/listview/index.dart b/lib/widget/scrollview/listview/index.dart index 9bb9213..6ecbd22 100644 --- a/lib/widget/scrollview/listview/index.dart +++ b/lib/widget/scrollview/listview/index.dart @@ -1,3 +1,8 @@ +/** + * Author: 林浩然 + * Link: https://github.com/DIVINER-only + * Email: 1476589247@qq.com + */ import 'package:flutter/material.dart'; import 'package:efox_flutter/components/widgetComp.dart' as WidgetComp; import 'demo.dart' as Demo; @@ -5,7 +10,8 @@ import 'demo.dart' as Demo; class Index extends StatefulWidget { static String title = 'ListView'; static String mdUrl = 'docs/widget/scrollview/listview/index.md'; - static String originCodeUrl = 'https://docs.flutter.io/flutter/widgets/ListView-class.html'; + static String originCodeUrl = + 'https://docs.flutter.io/flutter/widgets/ListView-class.html'; @override _IndexState createState() => new _IndexState(); @@ -15,12 +21,11 @@ class _IndexState extends State { @override Widget build(BuildContext context) { return WidgetComp.Index( - title: Index.title, - originCodeUrl: Index.originCodeUrl, - mdUrl: Index.mdUrl, - demoChild: [ - Demo.Index(), - ] - ); + title: Index.title, + originCodeUrl: Index.originCodeUrl, + mdUrl: Index.mdUrl, + demoChild: [ + Demo.Index(), + ]); } } diff --git a/locale/en.json b/locale/en.json index bdf0eea..b2134ea 100644 --- a/locale/en.json +++ b/locale/en.json @@ -7,7 +7,7 @@ "regularLayout": "common layout" }, "common" : { - "changeLanguage": "changeLanguage", + "changeLanguage": "显示中文", "changeVersion": "checkVersion", "changeEnvironment": "changeEnvironment", "compProgress": "Components Progress" diff --git a/locale/zh.json b/locale/zh.json index 0cf788d..5f08471 100644 --- a/locale/zh.json +++ b/locale/zh.json @@ -7,7 +7,7 @@ "regularLayout": "常规布局" }, "common" : { - "changeLanguage": "切换语言", + "changeLanguage": "Switch to English", "changeVersion": "更新版本", "changeEnvironment": "切换环境", "compProgress": "组件进度" diff --git a/pubspec.yaml b/pubspec.yaml index 8d650bd..f827675 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -57,6 +57,8 @@ flutter: # - images/a_dot_ham.jpeg assets: - locale/ + - assets/ + - assets/imgs/ - docs/widget/scrollview/customscrollview/ - docs/widget/scrollview/gridview/ - docs/widget/scrollview/listview/ @@ -89,12 +91,14 @@ flutter: - docs/widget/form/checkbox/ - docs/widget/form/checkboxlisttile/ - docs/widget/form/slider/ + - docs/widget/form/switch/ + - docs/widget/form/switchlisttile/ - docs/widget/form/daypicker/ + - docs/widget/form/radio/ + - docs/widget/form/radiolisttile/ - docs/widget/form/form/ - docs/widget/form/formfield/ - - docs/widget/form/radio/ - docs/widget/form/rawkeyboard/ - - docs/widget/form/switch/ - docs/widget/form/textfield/ - docs/widget/form/textinput/ - docs/widget/navigator/appbar/ diff --git a/readme.md b/readme.md index 153e295..b279bc8 100644 --- a/readme.md +++ b/readme.md @@ -1,230 +1,198 @@ # Flutter UI +![https://raw.githubusercontent.com/efoxTeam/flutter-ui/dev-ken/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png](https://raw.githubusercontent.com/efoxTeam/flutter-ui/dev-ken/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png) > flutter ui 开发者社区 提供各种flutter相关开发教程 +## 项目背景 +* Google推出Flutter跨平台解决方案,渐渐地受到了开发者们的关注,结合dart使用,能够用一套代码实现开发iOS与Android两套应用,未来还将可以直接编译成桌面应用。 +* Flutter拥有丰富的组件库,多样化的主题与UI风格,让开发者更简单的上手完成界面交互,从而提高了开发效率。 +* 随着大厂纷纷着手研究与实践后,本团队利用工作之余,也迈进对Flutter了认知的旅程中,并对组件进行归类与逐步细化,着手于技术要点分析与总结。 +* 此套组件库在几次没有硝烟的研讨中,命名为"Flutter UI",使命为"知识千万点,学习第一条。代码快点敲,bug无数行"。没错,就是这么不押韵。 +* 希与各位技术大大,有兴趣的小伙伴们一起交流,一起进步。 + +## PR规范 +* 欢迎有兴趣的小伙伴参与进来,一同完善组件,同是也把相关问题通过issues方式与我们联系。 +1. 确保一个PR只做一个issues或一个组件分享,或一个特殊的主题分享等,即命题唯一 +2. 可通过pull request提交到test-pr分支,指定给任意管理员。 +3. 明确标题性质,是issues还是改进的内容,描述背景,完善的实现方案或关键的解决要素,梳理对用户的影响与风险,罗列合并的内容与变更日志,相关后续规划 +* 模板 +``` +# 标题: 如关于xxx问题的解决方案、关于xxx组件的分享 +# 性质: 可选择issues/share/others +# 问题背景描述 + 在xxx场景下,遇到了以下几点问题 + 1,问题1... + 2,问题2... + ... +# 解决方案:基于xxx问题,提供以下解决方案 + 1,在xxx地方进行优化 + 2,在xxx代码中进行优化 + ... +# 用户影响与风险 + 1,xxx变动会影响xxx功能 + 2,预期可能会存在xxx问题 + 3,是否会隐藏哪些其它风险等 +# 清单 + 1,xxx文档 + 2,罗列相关变动的文件 + 3,代码视频或效果展示等内容 + 4,change log等 +# 后续规划 + 1,xxx阶段实现xxx功能 + 2,其它预期规划。 +``` + +## 环境 +* 自行完成flutter环境配置 +* 通过git clone本项目master分支代码,进入项目 +* 切换flutter到master分支,步骤如下(若已切换可跳过) +1. flutter channel master // 选择master分支 +2. flutter upgrade // 更新代码 +* 运行模拟器或真机 +* flutter run运行程序 + ## app预览 ![Alt 预览](readme/flutter_ui2.gif) ![Alt 预览](readme/flutter_ui3.gif) - ## 目录 ``` Flutter UI ├─assets 静态资源 ├─docs 教程文件 - ├─widget - ├─regular - ├─scrollview - ... + ├─locale 语言包 ├─lib dart执行代码 ├─components - ├─config + ├─config 配置文件 ├─controller - ├─lang - ├─page + ├─lang 多语言控制类 + ├─page 路由关联页面 │ ├─component │ └─mine - ├─router - ├─store + ├─router 路由 + ├─store 数据管理 │ ├─models │ └─objects - ├─utils - └─widget + ├─utils 项目工具类 + └─widget 项目组件库 ├─animate - │ ├─animatedbuilder + │ ├─animatedbuilder 【✔️ v1.0】 │ ├─animatedcontainer - ...... + │ ├─animatedcrossfade + │ ├─animateddefaulttextstyle + │ ├─animatedliststate + │ ├─animatedmodalbarrier + │ ├─animatedopacity + │ ├─animatedphysicalmodel + │ ├─animatedpositioned + │ ├─animatedsize + │ ├─animatedwidget + │ ├─animatedwidgetbasestate + │ ├─animationcontroller + │ ├─decoratedboxtransition + │ ├─fadetransition + │ ├─hero + │ ├─positionedtransition + │ ├─rotationtransition + │ ├─scaletransition + │ ├─sizetransition │ └─slidetransition ├─bulletbox - │ ├─alertdialog - │ ├─bottomsheet - ...... - │ └─snackbar + │ ├─alertdialog 【✔️ v1.0】 + │ ├─bottomsheet 【✔️ v1.0】 + │ ├─expansionPanel 【✔️ v1.0】 + │ ├─simpledialog 【✔️ v1.0】 + │ └─snackbar 【✔️ v1.0】 ├─common │ ├─assetbundle │ ├─buttonbar - ...... + │ ├─chip + │ ├─container 【✔️ v1.0】 + │ ├─divider 【✔️ v1.0】 + │ ├─flatbutton 【✔️ v1.0】 + │ ├─icon + │ ├─iconbutton + │ ├─image + │ ├─listtile + │ ├─placeholder + │ ├─raisedbutton + │ ├─rawimage + │ ├─stepper + │ ├─text 【✔️ v1.0】 │ └─tooltip ├─form - │ ├─checkbox - │ ├─checkboxlisttile - ...... + │ ├─checkbox 【✔️ v1.0】 + │ ├─checkboxlisttile 【✔️ v1.0】 + │ ├─slider 【✔️ v1.0】 + │ ├─switch 【✔️ v1.0】 + │ ├─switchListTile 【✔️ v1.0】 + │ ├─daypicker 【✔️ v1.0】 + │ ├─radio 【✔️ v1.0】 + │ ├─radioListTile 【✔️ v1.0】 + │ ├─form + │ ├─formfield + │ ├─rawkeyboard + │ ├─textfield 【✔️ v1.0】 │ └─textinput ├─gestures │ ├─absorbpointer │ ├─dismissible - ...... - │ └─longpressdraggable + │ ├─dragtarget + │ ├─gesturedetector + │ ├─ignorepointer + │ └─longpressdraggable 【✔️ v1.0】 ├─navigator │ ├─appbar │ ├─bottomnavigationbar - ...... + │ ├─drawer + │ ├─floatingactionbutton + │ ├─materialapp + │ ├─navigator + │ ├─popupmenubutton + │ ├─scaffold + │ ├─tabbar + │ ├─tabbarview │ └─widgetsapp ├─regular - │ ├─align - │ ├─aspectratio - ...... - │ └─wrap + │ ├─align 【✔️ v1.0】 + │ ├─aspectratio 【✔️ v1.0】 + │ ├─center 【✔️ v1.0】 + │ ├─column 【✔️ v1.0】 + │ ├─constrainedbox 【✔️ v1.0】 + │ ├─container 【✔️ v1.0】 + │ ├─fittedbox 【✔️ v1.0】 + │ ├─flow 【✔️ v1.0】 + │ ├─layoutbuilder 【✔️ v1.0】 + │ ├─listbody 【✔️ v1.0】 + │ ├─listview 【✔️ v1.0】 + │ ├─padding 【✔️ v1.0】 + │ ├─row 【✔️ v1.0】 + │ ├─stack 【✔️ v1.0】 + │ ├─table 【✔️ v1.0】 + │ └─wrap 【✔️ v1.0】 ├─scrollview - │ ├─customscrollview - │ ├─gridview - ...... - │ └─singlechildscrollview + │ ├─customscrollview 【✔️ v1.0】 + │ ├─gridview 【✔️ v1.0】 + │ ├─listview 【✔️ v1.0】 + │ ├─nestedscrollview 【✔️ v1.0】 + │ ├─scrollable 【✔️ v1.0】 + │ ├─scrollbar 【✔️ v1.0】 + │ ├─scrollcontroller 【✔️ v1.0】 + │ └─singlechildscrollview 【✔️ v1.0】 └─vision ├─backdropfilter ├─clipoval - ...... + ├─clippath + ├─cliprect + ├─custompaint + ├─decoratedbox + ├─fractionaltranslation + ├─mediaquery + ├─opacity + ├─rotatedbox + ├─theme └─transform - - ├─locale 语言包 ``` -## 组件进度列表 -### animate -1. animationController【✔️ v1.0】 -2. animatedbuilder【】 -3. animatedcontainer【】 -4. animatedcrossfade【】 -5. animateddefaulttextstyle【】 -6. animatedliststate【】 -7. animatedmodalbarrier【】 -8. animatedopacity【】 -9. animatedphysicalmodel【】 -10. animatedpositioned【】 -11. animatedsize【】 -12. animatedwidget【】 -13. animatedwidgetbasestate【】 -14. animationcontroller【】 -15. decoratedboxtransition【】 -16. fadetransition【】 -17. hero【】 -18. positionedtransition【】 -19. rotationtransition【】 -20. scaletransition【】 -21. sizetransition【】 -22. slidetransition【】 -``` - - -### bulletbox -1. alertdialog【✔️ v1.0】 -2. bottomsheet【✔️ v1.0】 -3. expansionPanel【✔️ v1.0】 -4. simpledialog【✔️ v1.0】 -5. snackbar【✔️ v1.0】 - -### common - -1. assetbundle【】 -2. buttonbar【】 -3. chip【】 -4. container【✔️ v1.0】 -5. divider【✔️ v1.0】 -6. flatbutton【✔️ v1.0】 -7. icon【】 -8. iconbutton【】 -9. image【】 -10. listtile【】 -11. placeholder【】 -12. raisedbutton【】 -13. rawimage【】 -14. stepper【】 -15. text【✔️ v1.0】 -16. tooltip【】 - - -### form - -1. checkbox【✔️ v1.0】 -2. checkboxlisttile【✔️ v1.0】 -3. slider【✔️ v1.0】 -4. daypicker【】 -5. form【】 -6. formfield【】 -7. radio【】 -8. rawkeyboard【】 -9. switch【】 -10. textfield【】 -11. textinput【】 -12. 【】 -13. 【】 - - -### gestures - -1. absorbpointer【】 -2. dismissible【】 -3. dragtarget【】 -4. gesturedetector【】 -5. ignorepointer【】 -6. longpressdraggable【✔️ v1.0】 - - -### navigator - -1. appbar【】 -2. bottomnavigationbar【】 -3. drawer【】 -4. floatingactionbutton【】 -5. materialapp【】 -6. navigator【】 -7. popupmenubutton【】 -8. scaffold【】 -9. tabbar【】 -10. tabbarview【】 -11. widgetsapp【】 - - -### regular - -1. align【✔️ v1.0】 -2. aspectratio【✔️ v1.0】 -3. center【✔️ v1.0】 -4. column【✔️ v1.0】 -5. constrainedbox【✔️ v1.0】 -6. container【✔️ v1.0】 -7. fittedbox【✔️ v1.0】 -8. flow【✔️ v1.0】 -9. layoutbuilder【✔️ v1.0】 -10. listbody【✔️ v1.0】 -11. listview【✔️ v1.0】 -12. padding【✔️ v1.0】 -13. row【✔️ v1.0】 -14. stack【✔️ v1.0】 -15. table【✔️ v1.0】 -16. wrap【✔️ v1.0】 - - -### scrollview - -1. customscrollview【✔️ v1.0】 -2. gridview【✔️ v1.0】 -3. listview【✔️ v1.0】 -4. nestedscrollview【✔️ v1.0】 -5. scrollable【✔️ v1.0】 -6. scrollbar【✔️ v1.0】 -7. scrollcontroller【✔️ v1.0】 -8. singlechildscrollview【✔️ v1.0】 -9. 【】 -10. 【】 -11. 【】 -12. 【】 - - -### vision - -1. backdropfilter【】 -2. clipoval【】 -3. clippath【】 -4. cliprect【】 -5. custompaint【】 -6. decoratedbox【】 -7. fractionaltranslation【】 -8. mediaquery【】 -9. opacity【】 -10. rotatedbox【】 -11. theme【】 -12. transform【】 -

AltStyle によって変換されたページ (->オリジナル) /