内容:
1、Button
RaisedButton( child:Text("normal"), onPressed:()=>{}, ) FlatButton( child:Text("normal"), onPressed:()=>{},) OutlineButton( child: Text("normal"), onPressed: ()=>{}, ) IconButton( icon:Icon(Icon.thumb_up), onPressed: ()=>{}, )
2、Image、Icon
const Image({ ... this.width, //图片的宽 this.height, //图片高度 this.color, //图片的混合色值 this.colorBlendMode, //混合模式 this.fit,//缩放模式 this.alignment = Alignment.center, //对齐方式 this.repeat = ImageRepeat.noRepeat, //重复方式 ...})
2.2 从asset 加载图片
assets:
- images/avatar.png
注意: 由于 yaml 文件对缩进严格,所以必须严格按照每一层两个空格的方式进行缩进,此处assets前面应有两个空格。
3.加载图片
Image( image: AssetImage("images/avatar.png"), width: 100.0); //Image也提供了一个快捷的构造函数Image.asset用于从asset中加载、显示图片: Image.asset("images/avatar.png", width: 100.0,)
//从网络加载图片
Icon
fonts:
family:myIcon 指定一个字体名
fonts:
-asset: fonts/iconfont.ttf
2、为了方便使用 定义一个MyIcons类,将字体文件中的所有图标都定义为静态变量:
class MyIcons{ // book 图标 static const IconData book = const IconData( 0xe614, fontFamily: ‘myIcon‘, matchTextDirection: true ); // 微信图标 static const IconData wechat = const IconData( 0xec7d, fontFamily: ‘myIcon‘, matchTextDirection: true ); }
3、使用
Row( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Icon(MyIcons.book,color: Colors.purple,), Icon(MyIcons.wechat,color: Colors.green,), ],)
Flutter默认包含了一套Material Design的字体图标,在pubspec.yaml文件中的配置如下:
flutter: uses-material-design: true
示例:
Row( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Icon(Icons.accessible,color: Colors.green,), Icon(Icons.error,color: Colors.green,), Icon(Icons.fingerprint,color: Colors.green,), ],)
class SwitchAndCheckBoxTestRoute extends StatefulWidget { @override _SwitchAndCheckBoxTestRouteState createState() => new _SwitchAndCheckBoxTestRouteState();} class _SwitchAndCheckBoxTestRouteState extends State<SwitchAndCheckBoxTestRoute> { bool _switchSelected=true; //维护单选开关状态 bool _checkboxSelected=true;//维护复选框状态 @override Widget build(BuildContext context) { return Column( children: <Widget>[ Switch( value: _switchSelected,//当前状态 onChanged:(value){ //重新构建页面 setState(() { _switchSelected=value; }); }, ), Checkbox( value: _checkboxSelected, activeColor: Colors.red, //选中时的颜色 onChanged:(value){ setState(() { _checkboxSelected=value; }); } , ) ], ); }}
4、输入框
TextField 用于文本输入。
4.1 构造方法
const TextField({ ... TextEditingController controller, FocusNode focusNode, InputDecoration decoration = const InputDecoration(), TextInputType keyboardType, TextInputAction textInputAction, TextStyle style, TextAlign textAlign = TextAlign.start, bool autofocus = false, bool obscureText = false, int maxLines = 1, int maxLength, bool maxLengthEnforced = true, ValueChanged<String> onChanged, VoidCallback onEditingComplete, ValueChanged<String> onSubmitted, List<TextInputFormatter> inputFormatters, bool enabled, this.cursorWidth = 2.0, this.cursorRadius, this.cursorColor, ...})
4.2 获取文本内容:
//方式一 、定义变量,在onChange触发时,保存输入内容 TextField( autofocus: true, onChanged:(v){ print("onChange:$v"); } ) //方式二、通过controller获取 TextEditingController _unameController=new TextEditingController(); TextField( autofocus: true, controller: _unameController, //设置controller ...) //通过controller 获取输入框内容 print(_unameController.text)
4.3 监听文本变化:
//方式一、通过设置onChange回调 TextField(autofocus:true, onChanged: (v){ print("onChange:$v") }) //方式二、通过controller监听,如: @override void initState(){ //监听输入改变 _unameController.addListener((){ print(_unameController.text); }); }
示例:
class FocusTestRoute extends StatefulWidget { @override _FocusTestRouteState createState() => new _FocusTestRouteState();} class _FocusTestRouteState extends State<FocusTestRoute> { FocusNode focusNode1 = new FocusNode(); FocusNode focusNode2 = new FocusNode(); FocusScopeNode focusScopeNode; @override Widget build(BuildContext context) { return Padding( padding: EdgeInsets.all(16.0), child: Column( children: <Widget>[ TextField( autofocus: true, focusNode: focusNode1,//关联focusNode1 decoration: InputDecoration( labelText: "input1" ), ), TextField( focusNode: focusNode2,//关联focusNode2 decoration: InputDecoration( labelText: "input2" ), ), Builder(builder: (ctx) { return Column( children: <Widget>[ RaisedButton( child: Text("移动焦点"), onPressed: () { //将焦点从第一个TextField移到第二个TextField // 这是一种写法 FocusScope.of(context).requestFocus(focusNode2); // 这是第二种写法 if(null == focusScopeNode){ focusScopeNode = FocusScope.of(context); } focusScopeNode.requestFocus(focusNode2); }, ), RaisedButton( child: Text("隐藏键盘"), onPressed: () { // 当所有编辑框都失去焦点时键盘就会收起 focusNode1.unfocus(); focusNode2.unfocus(); }, ), ], ); }, ), ], ), ); } }
4.5 监听焦点状态改变事件:
// 创建 focusNode FocusNode focusNode = new FocusNode();...// focusNode绑定输入框 TextField(focusNode: focusNode);...// 监听焦点变化 focusNode.addListener((){ print(focusNode.hasFocus);});
Form({ @required Widget child, bool autovalidate = false, WillPopCallback onWillPop, VoidCallback onChanged, })
FormFieId
构造方法:
const FormField({ ... FormFieldSetter<T> onSaved, //保存回调 FormFieldValidator<T> validator, //验证回调 T initialValue, //初始值 bool autovalidate = false, //是否自动校验。})
示例:登录页面
class FormTestRoute extends StatefulWidget { @override _FromTestRouteState createState() => new _FromTestRouteState(); } class _FromTestRouteState extends State<FormTestRoute> { GlobalKey _formKey = new GlobalKey<FormState>(); TextEditingController _unameController = new TextEditingController(); TextEditingController _pwdController = new TextEditingController(); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("Form test"), ), body: Padding( padding: const EdgeInsets.symmetric(vertical: 16.0, horizontal: 24.0), child: Form( key: _formKey, autovalidate: true, child: Column( children: <Widget>[ TextFormField( autofocus: true, controller: _unameController, decoration: InputDecoration( labelText: "用户名", hintText: "用户名或邮箱", icon: Icon(Icons.people)), validator: (v) { return v.trim().length > 0 ? null : "用户名不能为空"; }, ), TextFormField( controller: _pwdController, decoration: InputDecoration( labelText: "密码", hintText: "您登录的密码", icon: Icon(Icons.lock)), obscureText: true, validator: (v) { return v.trim().length > 5 ? null : "密码不能少于6位"; }, ), Padding( padding: const EdgeInsets.only(top: 28.0), child: Row( children: <Widget>[ Expanded(child: Builder(builder: (context) { return RaisedButton( padding: EdgeInsets.all(15.0), child: Text("登录"), color: Theme.of(context).primaryColor, textColor: Colors.white, onPressed: () { if ((_formKey.currentState as FormState) .validate()) { //验证通过提交数据,登录 print(_unameController.text); print(_pwdController.text); } }); })) ], ), ) ], ), ), ), ); } @override void initState() { // TODO: implement initState _unameController.addListener(() { print(_unameController.text); }); } }
原文:https://www.cnblogs.com/changeMsBlog/p/11297189.html