前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Flutter跨平台移动端开发丨Text、Button、Image、Switch、Checkbox、TextField

Flutter跨平台移动端开发丨Text、Button、Image、Switch、Checkbox、TextField

作者头像
码脑
发布2019-05-25 09:08:19
2.5K0
发布2019-05-25 09:08:19
举报
文章被收录于专栏:大前端大前端

目录

  1. Text Widget(文本)
  2. Button Widget(按钮)
  3. Image Widget(图片)
  4. Switch and Checkbox(开关按钮及复选框)
  5. TextField Widget(输入框)

Text Widget(文本)

文字类信息展示都是使用 Text Widget 来承载

代码语言:javascript
复制
  const Text(this.data, {
    Key key,
    this.style,
    this.strutStyle,
    this.textAlign,
    this.textDirection,
    this.locale,
    this.softWrap,
    this.overflow,
    this.textScaleFactor,
    this.maxLines,
    this.semanticsLabel,
  }) : assert(data != null),
       textSpan = null,
       super(key: key);
  • key:唯一标识ID
  • textAlign:居中显示文字
  • maxLines、overflow:控制文字显示样式
  • textScaleFactor:控制字体大小
  • TextStyle:添加样式
  • TextSpan:文字片段设置
  • DefaultTextStyle:子节点继承父节点样式
代码语言:javascript
复制
/**
 * @des Text Widget
 * @author liyongli 20190411
 * */
class SomeWidget extends StatefulWidget{

  @override
  State<StatefulWidget> createState() =>  new _SomeState();

}

/**
 * Text Widget 属性及样式控制模块
 * */
class _SomeState extends State<SomeWidget>{

  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      home: new Scaffold(
        appBar: new AppBar(
          title: new Text("Text Widget"),
        ),
        body: new Column(
          children: <Widget>[

            // 居中显示文字 textAlign
            new Padding(
              padding: new EdgeInsets.all(20),
              child: new Text("1. " + "居中显示 "*10, textAlign: TextAlign.center,),
            ),

            // 控制文字显示样式 maxLines overflow
            new Padding(
              padding: new EdgeInsets.all(20),
              child: new Text("2. " + "控制行数"*20, maxLines: 2,overflow: TextOverflow.ellipsis,),
            ),

            // 控制字体大小 textScaleFactor
            new Padding(
              padding: new EdgeInsets.all(20),
              child: new Text("3. " + "字体大小"*10, textScaleFactor:2.0, textAlign: TextAlign.right, maxLines: 2, overflow: TextOverflow.ellipsis,),
            ),

            // 添加样式 TextStyle
            new Padding(
              padding: new EdgeInsets.all(20),
              child: new Text("4. " + "添加样式"*10, textScaleFactor:2.0, textAlign: TextAlign.right, maxLines: 2, overflow: TextOverflow.ellipsis,style: new TextStyle(
                color: Color(0xFFd72722),
                fontSize: 11,
                fontWeight: FontWeight.w900,
                background: new Paint()..color = Color(0xff999999),
                decoration: TextDecoration.lineThrough,
                decorationColor: Colors.amberAccent,
                decorationStyle: TextDecorationStyle.dashed
              ),),
            ),

            // 文字片段设置 TextSpan
            new Padding(
              padding: new EdgeInsets.all(20),
              child: Text.rich(TextSpan(
                children: [
                  TextSpan(
                    text: "5. " + "五颜"*5,
                    style: TextStyle(
                      color: Color(0xffd72722),
                    )
                  ),
                  TextSpan(
                    text: "和"*5,
                    style: TextStyle(
                      color: Color(0xff333333)
                    )
                  ),
                  TextSpan(
                    text:"六色"*5,
                    style: TextStyle(
                    color: Color(0xff999999)
                    )
                  )
                ]
              ))
            ),

            // 继承父节点样式 DefaultTextStyle
            new Padding(
              padding: new EdgeInsets.all(20),
              child: DefaultTextStyle(

                  // 设置默认样式
                  style: TextStyle(
                    color: Color(0xffd72722),
                    fontWeight: FontWeight.w900,
                  ),

                  // 继承父节点样式
                  child: Column(
                    children: <Widget>[
                      new Text("6. 继承父节点样式"),
                      new Text("父节点啥样我啥样"),
                      new Text("父节点啥样我啥样"),
                      new Text("父节点啥样我不管,变异了", style: TextStyle(
                        inherit: false,
                        color: Color(0xff333333)
                      ),),
                    ],
                  ))
            ),
          ],
        ),
      ),
    );
  }
}

Button Widget(按钮)

Material 库中的按钮点击时默认带有“水波动画”,点击事件监听通过 onPressed 属性设置,若不设置 onPressed 则按钮处于禁用状态无点击动效也不响应点击事件

代码语言:javascript
复制
  const MaterialButton({
    Key key,
    @required this.onPressed,
    this.onHighlightChanged,
    this.textTheme,
    this.textColor,
    this.disabledTextColor,
    this.color,
    this.disabledColor,
    this.highlightColor,
    this.splashColor,
    this.colorBrightness,
    this.elevation,
    this.highlightElevation,
    this.disabledElevation,
    this.padding,
    this.shape,
    this.clipBehavior = Clip.none,
    this.materialTapTargetSize,
    this.animationDuration,
    this.minWidth,
    this.height,
    this.child,
  }) : super(key: key);
  • RaisedButton:漂浮按钮,默认带有阴影和灰色背景,点击时阴影会变大
  • FlatButton:扁平按钮,
  • OutlineButton:带边框按钮
  • IconButton:带图标按钮
  • Custom FlatButton:自定义扁平按钮
  • Custom RaisedButton:自定义漂浮按钮
代码语言:javascript
复制
/**
 * @des Button Widget
 * @author liyongli 20190411
 * */
class ButtonWidget extends StatefulWidget{

  @override
  State<StatefulWidget> createState() => new _ButtonState();

}

/**
 * Button Widget 属性及样式控制模块
 * */
class _ButtonState extends State<ButtonWidget>{
  
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      home: new Scaffold(

        // 设置导航栏
        appBar: new AppBar(
          title: Text("Button Widget"),
        ),

        // 设置主体
        body: new Center(
          child: new Column(
            children: <Widget>[

              // 漂浮按钮
              new Padding(
                 padding: EdgeInsets.all(15.0),
                 child: new RaisedButton(onPressed: _BtnClick, child: Text("RaisedButton / 漂浮按钮"),),
              ),

              // 扁平按钮
              new Padding(
                padding: EdgeInsets.all(15.0),
                child:  new FlatButton(onPressed: _BtnClick, child: Text("FlatButton / 扁平按钮")),
              ),

              // 带边框按钮
              new Padding(
                padding: EdgeInsets.all(15.0),
                child: new OutlineButton(onPressed: _BtnClick, child: Text("OutlineButton / 带边框按钮"),),
              ),

              // 带图标按钮
              new Padding(
                padding: EdgeInsets.all(15.0),
                child: new IconButton(icon: Icon(Icons.thumb_up), onPressed: _BtnClick,),
              ),

              // 自定义按钮
              new Padding(
                padding: EdgeInsets.all(15.0),
                child: new FlatButton(
                  child: Text("自定义 FlatButton"),
                  onPressed: _BtnClick,
                  color: Colors.blue ,
                  textColor: Colors.white,
                  shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)),
                ),
              ),

              // 自定义按钮
              new Padding(
                padding: EdgeInsets.all(15.0),
                child: new RaisedButton(
                  child: Text("自定义 RaisedButton"),
                  onPressed: _BtnClick,
                  color: Colors.deepOrange ,
                  textColor: Colors.white,
                  shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(5)),
                ),
              ),

            ],
          ),
        )
      ),
    );
  }

  // 按钮点击监听
  void _BtnClick(){
    print("点击啦,啦啦啦");
  }

}

Image Widget(图片)

Image 的数据源可以是asset、文件、内存或网络图片

代码语言:javascript
复制
  const Image({
    Key key,
    @required this.image,
    this.semanticLabel,
    this.excludeFromSemantics = false,
    this.width,
    this.height,
    this.color,
    this.colorBlendMode,
    this.fit,
    this.alignment = Alignment.center,
    this.repeat = ImageRepeat.noRepeat,
    this.centerSlice,
    this.matchTextDirection = false,
    this.gaplessPlayback = false,
    this.filterQuality = FilterQuality.low,
  }) : assert(image != null),
       assert(alignment != null),
       assert(repeat != null),
       assert(filterQuality != null),
       assert(matchTextDirection != null),
       super(key: key);
  • ImageProvider:抽象类,定义了图片数据获取接口 load()
  • AssetImage:从 Asset 中加载图片的 ImageProvide
  • NetworkImage:从网络记载图片的 ImageProvider

AssetImage(加载本地图片)

  1. 工程根目录下创建文件夹 images 存放图片文件
  2. 在 pubspec.yaml 文件中 flutter 部分添加图片注册信息
代码语言:javascript
复制
flutter:

  # The following line ensures that the Material Icons font is
  # included with your application, so that you can use the icons in
  # the material Icons class.
  uses-material-design: true
  assets:
  - images/image_widget_test.jpg
  1. 在 widget 中设置加载本地图片
代码语言:javascript
复制
Image.asset("images/image_widget_test.jpg",width: 144,height: 200, fit: BoxFit.fitHeight,),

NetworkImage(加载网络图片)

加载网络图片有两种方式可选

  • NetworkImage
代码语言:javascript
复制
Image(image: NetworkImage("https://ss0.baidu.com/6ONWsjip0QIZ8tyhnq/it/u=3120670470,3551547131&fm=58&bpow=3071&bpoh=4429"),width: 144,height: 200, fit: BoxFit.fitHeight,),
  • Image.network
代码语言:javascript
复制
Image.network("https://ss0.baidu.com/6ONWsjip0QIZ8tyhnq/it/u=3120670470,3551547131&fm=58&bpow=3071&bpoh=4429", width: 144,height: 200, fit: BoxFit.fitHeight,),

AssetImage - NetworkImage - Image.network

Image属性控制

代码语言:javascript
复制
const Image({
  ...
  this.width, //图片的宽
  this.height, //图片高度
  this.color, //图片的混合色值
  this.colorBlendMode, //混合模式
  this.fit,//缩放模式
  this.alignment = Alignment.center, //对齐方式
  this.repeat = ImageRepeat.noRepeat, //重复方式
  ...
})

Switch and Checkbox(开关按钮及复选框)

Switch 和 Checkbox 都继承 StatelessWidget ,自身也就不会保留状态,状态由父widget管理

代码语言:javascript
复制
  const 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.down,
  }) : _switchType = _SwitchType.material,
       assert(dragStartBehavior != null),
       super(key: key);
代码语言:javascript
复制
/**
 * @des SwitchWidget and CheckboxWidget
 * @author liyongli 20190417
 * */
class SwitchCheckBoxWidget extends StatefulWidget{

  @override
  State<StatefulWidget> createState() =>  new _SwitchCheckBoxState();

}

class _SwitchCheckBoxState extends State<SwitchCheckBoxWidget>{

  // 开关状态
  bool _switchSelected = true;
  // 复选框状态
  bool _checkboxSelected = true;

  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      home: new Scaffold(
        
        // 设置导航栏
        appBar: new AppBar(
          title: Text("Switch and CheckBox"),
        ),

        body: Center(
          child: new Column(
            children: <Widget>[

              // 开关组件
              new Switch(
                  value: _switchSelected,
                  onChanged: (value){
                    setState(() {
                      // 更新开关状态
                      _switchSelected = value;
                    });
                  }),

              // 复选框租金
              new Checkbox(
                  value: _checkboxSelected,
                  onChanged: (val){
                    setState(() {
                      // 更新选中状态
                      _checkboxSelected = val;
                    });
                  })
            ],
          )
        ),
      ),
    );
  }
}

TextField Widget(输入框)

代码语言:javascript
复制
  const TextField({
    Key key,
    this.controller,
    this.focusNode,
    this.decoration = const InputDecoration(),
    TextInputType keyboardType,
    this.textInputAction,
    this.textCapitalization = TextCapitalization.none,
    this.style,
    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.down,
    this.enableInteractiveSelection,
    this.onTap,
    this.buildCounter,
  }) : assert(textAlign != null),
       assert(autofocus != null),
       assert(obscureText != null),
       assert(autocorrect != null),
       assert(maxLengthEnforced != null),
       assert(scrollPadding != null),
       assert(dragStartBehavior != null),
       assert(maxLines == null || maxLines > 0),
       assert(maxLength == null || maxLength == TextField.noMaxLength || maxLength > 0),
       keyboardType = keyboardType ?? (maxLines == 1 ? TextInputType.text : TextInputType.multiline),
       super(key: key);
  • 输入框控制器 TextEditingController
  • 输入框事件监听 onChanged
  • 输入框样式修改 Theme
代码语言:javascript
复制
/**
 * @des TextField Widget
 * @author liyongli 20190419
 * */
class TextFieldWidget extends StatefulWidget{

  @override
  State<StatefulWidget> createState() => new _TextFieldState();

}

/**
 * TextField 属性及样式控制模块
 * */
class _TextFieldState extends State<TextFieldWidget>{

  // 账号输入框控制器
  TextEditingController _accountController = new TextEditingController();
  // 密码输入框控制器
  TextEditingController _passwordController = new TextEditingController();

  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      home: new Scaffold(

        // 导航栏样式
        appBar: new AppBar(
          title: Text("TextFieldWidget"),
        ),

        // 主体部分
        body: new Column(
          children: <Widget>[

            // 修改输入框默认样式
            Theme(
              data: Theme.of(context).copyWith(
                  hintColor: Color(0xff000000), // 修改下划线颜色
                  inputDecorationTheme: InputDecorationTheme(
                      labelStyle: TextStyle(color: Color(0xffd72722)), // 修改lable文字颜色
                      hintStyle: TextStyle(fontSize: 12.0,color: Color(0xff000000)) // 修改输入框提示文字颜色
                  )
              ),

              // 账号输入框
              child: new TextField(
                // 输入框控制器设置
                controller: _accountController,
                // 输入框文字变化监听
                onChanged: _changeLisener,
                // 是否获取焦点
                autofocus: true,
                // 样式控制
                decoration: new InputDecoration(
                  labelText: "账号",
                  hintText: "请输入账号",
                  prefixIcon: Icon(Icons.person),
                  border: InputBorder.none //隐藏下划线
                ),
              ),
            ),

            // 密码输入框
            new TextField(
              // 输入框控制器设置
              controller: _passwordController,
              // 输入框文字变化监听
              onChanged: _changeLisener,
              // 是否获取焦点
              autofocus: false,
              // 样式控制
              decoration: new InputDecoration(
                labelText: "密码",
                hintText: "请输入密码",
                prefixIcon: Icon(Icons.lock),
//                border: InputBorder.none
              ),
            ),

            new OutlineButton(
              onPressed: _submitLisener,
              child: Text("提 交"),
            )
          ],
        ),
      ),

    );
  }

  // 输入框文字改变监听
  void _changeLisener(str){
    print(str);
  }

  // 提交按钮监听
  void _submitLisener(){
    print(_accountController.text);
    print(_passwordController.text);
  }

  // 使用控制器初始化两个输入框值
  void _initAccountData(){
    _accountController.text = "123456";
    _passwordController.text = "654321";
  }

}

默认样式

通过 Theme 修改输入框 lable 文字颜色、提示文字颜色后(下划线已隐藏)



本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.05.24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Text Widget(文本)
  • Button Widget(按钮)
    • Image Widget(图片)
      • Switch and Checkbox(开关按钮及复选框)
        • TextField Widget(输入框)
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档