Flutter组件使用技巧(一)

简介: Flutter组件使用技巧(一)

一、颜色的使用


color:Color(0xFFF3F5FB), --十六进制颜色,最后6位为十六进制颜色值
color: Color.fromARGB(255, 24, 34, 34)),--RGB颜色值,
color: Color.fromARGB(0xFF, 0x42, 0xA5, 0xF5);
color: Color.fromARGB(255, 66, 165, 245);
color: Color.fromRGBO(66, 165, 245, 1.0);//opacity:不透明度
color:Color.blue


二、container设置


Container(
  width: 100,
  height: 100,
  alignment: Alignment.center,
  child: Text('有背景图'),
  decoration: BoxDecoration(
    color: Colors.red,
    image: DecorationImage(
      image: AssetImage('assets/images/dialog_success.png'),
      fit: BoxFit.fill, // 完全填充
    ),
  ),
),
Container(
    width: 250,
    height: 200,
    decoration: BoxDecoration(
      border: Border(
        top: BorderSide(width: 15.0, color: Color(0xFFFF7F7F7F)),
        left: BorderSide(width: 20.0, color: Color(0xFFFFDFDFDF)),
        right: BorderSide(width: 5.0, color: Color(0xFFFF000000)),
        bottom: BorderSide(width: 10.0, color: Color(0xFFFF000000)),
      ),
    )
)
Container(
          decoration: BoxDecoration(
            //设置边框
            border: new Border.all(color: Color(0xFFFF0000), width: 0.5),
            //背景颜色
            color: Colors.white, 
            //设置圆角
            borderRadius: new BorderRadius.circular((5.0)), 
      borderRadius: BorderRadius.only(
              topLeft: Radius.circular(10.0),
              bottomLeft: Radius.circular(10.0)
      ),
            //设置阴影
            boxShadow: [BoxShadow(color: Colors.lightGreen, offset: Offset(1.0, 1.0), blurRadius: 1.0, spreadRadius: 1.0), ],
          ),
)
Container(
          decoration: ShapeDecoration(
            image: new DecorationImage(
              //设置背景图片
              image: AssetImage("assets/images/task_icon.jpg"),
              fit: BoxFit.cover,
            ),
            //设置圆角
            shape:RoundedRectangleBorder(borderRadius: BorderRadiusDirectional.circular(20)),
          ),
          //设置边距
          margin: EdgeInsets.only(top: 16, left: 20, right: 20),
          child: new Card(
            color: Colors.transparent,
         ……
)


三、showModalBottomSheet设置


Future<T> showModalBottomSheet<T>({
  @required BuildContext context, 
  @required WidgetBuilder builder, 
  Color backgroundColor,
  double elevation,
  ShapeBorder shape,
  Clip clipBehavior,
  Color barrierColor,
  bool isScrollControlled = false,
  bool useRootNavigator = false,
  bool isDismissible = true,
  bool enableDrag = true,
})
builder:构造内容
backgroundColor:背景颜色指的是显示内容下面的颜色,要设置圆角弹窗,该项使用null,默认是灰白色,根据系统主题
elevation :阴影高度,没看出效果
ShapeBorder: 边线,可以指定单边或者多边,还可以是圆形的,ShapeBorder的子类都可以,还可以设置圆角
clipBehavior :widget剪裁模式,分none、hardEdge、antiAlias、antiAliasWithSaveLayer,效率依次降低,效果依次提高
barrierColor: 蒙版颜色,就是遮住原页面内容的半透明黑色,默认是Colors.black54
isScrollControlled :是否可滚动,用于调整内容部分的高度的模式,后面展开详细
useRootNavigator: 一般用不上
isDismissible :点击外部区域是否关闭弹窗,默认true
enableDrag: 启用拖拽功能,拖动弹窗关闭,默认true
 showModalBottomSheet(
      context: context,
       isScrollControlled:false,
      backgroundColor: Colors.white,
      shape: RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(10))),
   shape: RoundedRectangleBorder(
         borderRadius: BorderRadius.only(  --设置左上角和右上角圆角
              topLeft: Radius.circular(20.0),
              topRight: Radius.circular(20.0)
         ),
      ),
      builder: (BuildContext context) {
        return Container(
          child: Center(child: Text("居中文字")),
        );
      });
若要点击按钮关闭弹窗,在点击事件里面加入Navigator.pop(context)即可


四、TextField详解


TextField(
  controller: _inputController,//控制器
  focusNode: _inputFocusNode,//焦点
  style: TextStyle(fontSize: 16, color: Colors.black87),//文字大小、颜色
  maxLines: 10,//最多多少行
  minLines: 1,//最少多少行
  onChanged: (text) {//输入框内容变化回调
    setState(() {});
  },
  decoration: InputDecoration(
    fillColor: Colors.grey[50],//背景颜色,必须结合filled: true,才有效
    filled: true,//重点,必须设置为true,fillColor才有效
    isCollapsed: true,//重点,相当于高度包裹的意思,必须设置为true,不然有默认奇妙的最小高度
    contentPadding: EdgeInsets.symmetric(horizontal: 8, vertical: 10),//内容内边距,影响高度
    border: _outlineInputBorder,//边框,一般下面的几个边框一起设置
    //keyboardType: TextInputType.number, //键盘类型
    //obscureText: true,//密码模式
    focusedBorder: _outlineInputBorder,
    enabledBorder: _outlineInputBorder,
    disabledBorder: _outlineInputBorder,
    focusedErrorBorder: _outlineInputBorder,
    errorBorder: _outlineInputBorder,
      ),
    ),
)
/输入框控制器,一般用于获取文本、修改文本等
TextEditingController _inputController = TextEditingController();
//焦点节点,一般用于自动获取焦点,取消焦点以便隐藏键盘等
FocusNode _inputFocusNode = FocusNode();
//边框样式
OutlineInputBorder _outlineInputBorder = OutlineInputBorder(
  gapPadding: 0,
  borderSide: BorderSide(
    color: Colors.grey[200],
  ),
);


五、Expanded详解


只能在Column,Row,Flex以及它们的子组件,这里指的是子组件而不是子结点,是指继承Column,Row,Flex的子组件。
Expanded的父结点必须是Column,Row,Flex以及它们的子组件,不能是Column->Container->Expanded(表示结点路径)
在使用Expanded时,如果在它的上层结点中有List类型的结点,比如SingleChildScrollView,或者ListTile等,其滑动方向应该与Expanded填充方向不同,不然会报错。
Expanded作用是,填充剩余空间。
class Expanded extends Flexible {
  /// Creates a widget that expands a child of a [Row], [Column], or [Flex]
  /// so that the child fills the available space along the flex widget's
  /// main axis.
  const Expanded({
    Key? key,
    int flex = 1,
    required Widget child,
  }) : super(key: key, flex: flex, fit: FlexFit.tight, child: child);
}
flex:表示弹性系数,弹性系数越高,所占空间越大,类似于Android原生的LinearLayout的weight属性。
child:子节点
示例
flutter代码
Scaffold(
      appBar: AppBar(
        // Here we take the value from the MyHomePage object that was created by
        // the App.build method, and use it to set our appbar title.
        title: Text(widget.title),
      ),
      body: Column(
        children: [
          Expanded(
              flex: 1,
              child: Container(
                color: Colors.black,
              )),
          Expanded(
              flex: 2,
              child: Container(
                color: Colors.red,
              )),
          Expanded(
              flex: 1,
              child: Container(
                color: Colors.blue,
              ))
        ],
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
Row 和 Column 是 Flex 组件,是无法滚动的,如果没有足够的空间,flutter就提示溢出错误。
这种情况下,Expanded 或 Flexible 组件可用作长文本的自动换行。
第一个元素再换成 Expanded ,这样剩余的空间就会被第一个元素填充:
Column(
  children: <Widget>[
    Row(
      children: <Widget>[
        Expanded(child: Text('AAAA')),
        Text('ZZZZ')],
    ),
  ],
),
这样,当第一个元素是一个长文本,并且两个元素内容长于可用范围时,第一个元素会自动换行:
Column(
  children: <Widget>[
    Row(
      children: <Widget>[
        Expanded(child: Text(String.fromCharCodes(List.generate(100, (i) => 65)))),
        Text('ZZZZ')],
    ),
  ],
),


相关文章
|
2月前
|
传感器 缓存 监控
Stream 组件在 Flutter 中的应用场景有哪些?
Stream 组件在 Flutter 中的应用场景有哪些?
180 58
|
2月前
|
UED 开发者
Flutter|常用数据通信组件
Flutter|常用数据通信组件
103 49
|
22天前
Flutter 自定义组件继承与调用的高级使用方式
本文深入探讨了 Flutter 中自定义组件的高级使用方式,包括创建基本自定义组件、继承现有组件、使用 Mixins 和组合模式等。通过这些方法,您可以构建灵活、可重用且易于维护的 UI 组件,从而提升开发效率和代码质量。
116 1
|
22天前
|
开发工具 UED
Flutter&鸿蒙next中封装一个输入框组件
本文介绍了如何创建一个简单的Flutter播客应用。首先,通过`flutter create`命令创建项目;接着,在`lib`目录下封装一个自定义输入框组件`CustomInput`;然后,在主应用文件`main.dart`中使用该输入框组件,实现简单的UI布局和功能;最后,通过`flutter run`启动应用。本文还提供了后续扩展建议,如状态管理、网络请求和UI优化。
100 1
|
25天前
|
Dart UED
Flutter用户交互组件
Flutter用户交互组件
22 2
|
2月前
|
开发工具
Flutter-AnimatedWidget组件源码解析
Flutter-AnimatedWidget组件源码解析
173 60
|
1月前
|
存储 开发框架 开发者
flutter:代码存储&基本组件 (五)
本文档介绍了Flutter中的一些基本组件和代码示例,包括代码存储、基本组件如AppBar的简单使用、可滑动切换的标签栏、TextField的多种用法(如简单使用、登录页面、文本控制器的监听与使用、修饰等),以及如何实现点击空白区域隐藏键盘等功能。通过这些示例,开发者可以快速掌握在Flutter应用中实现常见UI元素的方法。
|
20天前
|
开发工具
Flutter&鸿蒙next中封装一个列表组件
Flutter&鸿蒙next中封装一个列表组件
35 0
|
2月前
|
开发者
Flutter|常用数据通信组件
Flutter|常用数据通信组件
|
2月前
Stream 组件在 Flutter 中的具体使用方法是什么?
Stream 组件在 Flutter 中的具体使用方法是什么?