Flutter-Widget组件

目录

一、基础组件

RichText

主要参数

使用示例

TextField

主要参数

辅助类

TextEditingController:提供了多种读取和操作输入文本的属性和方法

FocusNode:绑定输入框后控制其焦点变化

TextInputFormatter:通过正则表达式控制输入的内容和格式

使用示例

二、容器组件

BottomSheet

主要参数

GestureDetector

主要参数

Visibility

主要参数

三、布局组件

ListView

主要参数

构造函数

辅助类

SliverChildBuilderDelegate:提供一个 NullableIndexedWidgetBuilder builder 函数生成子组件

SliverChildListDelegate:提供一个 List children 生成子组件


一、基础组件

  • RichText

    在一段文本中使用不同的文字样式 或 在文本中插入其他小部件,比如:文字消息中插入表情、部分文字高亮/添加超链接、需要使用图标标志文字

    • 主要参数

        RichText({
          Key? key,			
          required this.text,		//必需参数,包含的文本内容,类型为InlineSpan
          //主要实现类为TextSpan,可嵌套InlineSpan列表,包含WidgetSpan,实现文本和其他部件的组合
          this.textAlign = TextAlign.start,		//文本对齐方式,默认为左对齐
          this.textDirection,		//文本方向
          this.softWrap = true,		//是否允许文本换行
          this.overflow = TextOverflow.clip,		//文本溢出时的处理方式,默认为裁剪掉溢出部分
          this.textScaleFactor = 1.0,		//文本缩放因子
          this.maxLines,		//文本最大行数
          this.locale,
          this.strutStyle,
          this.textWidthBasis = TextWidthBasis.parent,
          this.textHeightBehavior,
        }) : assert(text != null),
             assert(textAlign != null),
             assert(softWrap != null),
             assert(overflow != null),
             assert(textScaleFactor != null),
             assert(maxLines == null || maxLines > 0),
             assert(textWidthBasis != null),
             super(key: key, children: _extractChildren(text));
    • 使用示例

      	@override
        Widget build(BuildContext context) {
          return Center(
            child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  RichText(
                    text: const TextSpan(
                    	style: TextStyle(fontSize: 20),		//没有单独设置style的TextSpan的默认样式
                      children: [
                        WidgetSpan(
                            child: Icon(Icons.thumb_up,
                                size: 20,
                                color: Colors.amber)
                        ),
                        TextSpan(text: ' 点赞  '),
                        WidgetSpan(
                            child: Icon(Icons.favorite,
                                size: 20,
                                color: Colors.red)
                        ),
                        TextSpan(text: ' 收藏  '),
                        WidgetSpan(
                            child: Icon(Icons.chat,
                                size: 20,
                                color: Colors.indigoAccent)
                        ),
                        TextSpan(text: ' 评论  ')
                     ]))]));

  • TextField

    实现输入框行为限制和外观设置

    • 主要参数

        const TextField({
          Key? key,
          this.controller,		//输出框文本控制和监听工具,类型为TextEditingController
          this.focusNode,		//焦点管理工具,类型为FocusNode
          this.readOnly = false,		//是否只读,默认为false
          this.showCursor,		//是否显示光标
          this.autofocus = false,		//是否自动获取焦点,默认为false
          this.obscuringCharacter = '•',		//用于遮挡的字符
          this.obscureText = false,		//是否遮挡文本
          this.maxLines = 1,		//最大行数,默认为1
          this.maxLength,		//最大字符数
          this.onChanged,		//文本改变时的回调函数
          this.onEditingComplete,		//编辑完成时的回调函数
          this.onSubmitted,		//提交时的回调函数
          this.inputFormatters,		//格式化限制,类型为List<TextInputFormatter>
          this.enabled,		//是否启用
          this.onTap,		//点击时的回调函数
        })
    • 辅助类

      • TextEditingController:提供了多种读取和操作输入文本的属性和方法
        • 获取文本:text = TextController.text;

        • 设置文本:TextController.text = "new text";

        • 监听文本变化:TextController.addListener();

        • 清空文本:TextController.clear();

      • FocusNode:绑定输入框后控制其焦点变化
        • 请求焦点:FocusNode.requestFocus();

        • 失去焦点:FocusNode.unfocus();

        • 添加焦点监听器:FocusNode.addListener();

      • TextInputFormatter:通过正则表达式控制输入的内容和格式
        • 允许输入:FilteringTextInputFormatter.allow();

        • 禁止输入:FilteringTextInputFormatter.deny();

    • 使用示例

      class _HomeScreenState extends State<HomeScreen> {
        final TextEditingController _textController = TextEditingController();
        final FocusNode _focusNode = FocusNode();
      
        @override
        void dispose() {		//注销页面时释放资源
          _textController.dispose();
          _focusNode.dispose();
          super.dispose();
        }
      
        @override
        Widget build(BuildContext context) {
          return Scaffold(
            appBar: AppBar(
              title: Row(
                children: [
                  Expanded(
                    child: TextField(
                      controller: _textController,		//设置输入框的 TextEditingController
                      focusNode: _focusNode,		//设置输入框的 FocusNode
                      inputFormatters: [		//通过正则表达式限制输入
                        FilteringTextInputFormatter.allow(RegExp('[a-z0-9]')),
                        FilteringTextInputFormatter.deny(RegExp('[m-q]')),
                      ],
                      decoration: const InputDecoration(
                        labelText: '一个输入框',
                        border: OutlineInputBorder(),
                      ),
                      onSubmitted: (text) {
                        _focusNode.unfocus();		//输入完成后通过FocusNode令输入框失焦
                        setState(() {});		//更新body中的text
                      }
                    )
                  ),
                  IconButton(
                    icon: const Icon(Icons.clear,color: Colors.black),
                    onPressed: (){
                      setState(() {
                      	_textController.clear();		//通过 TextEditingController 清空输入框中的文本
                      });
                    })])),
            body: Center(
              child: Text(_textController.text)		//通过 TextEditingController 获取输入框中的文本
            ));
        }
      }

二、容器组件

  • BottomSheet

    页面底部弹出层,一般结合 Scaffold 中的 bottomNavigationBar 使用,提供动画效果控制和一些交互操作

    • 主要参数

        const BottomSheet({
          Key? key,
          this.animationController,		//动画控制器
          this.enableDrag = true,		//是否允许拖动,默认允许
          this.onDragStart,		//开始拖动时的回调函数
          this.onDragEnd,		//停止拖放时的回调函数
          this.backgroundColor,
          this.elevation,
          this.shape,
          this.clipBehavior,
          this.constraints,
          required this.onClosing,		//必需参数,底部弹出层关闭时的回调函数
          required this.builder,		//必需参数,构建底部弹出层内容
        }) : assert(enableDrag != null),
             assert(onClosing != null),
             assert(builder != null),
             assert(elevation == null || elevation >= 0.0),
             super(key: key);
  • GestureDetector

    实现手势行为检测,为其他组件提供相应各种交互操作的能力,如点击、双击、长按、拖动、缩放等

    • 主要参数

      GestureDetector({
          Key? key,
          this.child,		//需要交互的子组件
          this.onTap,		//单击手势回调函数
          this.onDoubleTap,		//双击手势回调函数
          this.onLongPress,		//长按手势回调函数
          this.onVerticalDragStart,this.onVerticalDragUpdate,this.onVerticalDragEnd,		//垂直拖动手势回调函数
          this.onHorizontalDragStart,this.onHorizontalDragUpdate,this.onHorizontalDragEnd,		//水平拖动手势回调函数
          this.onPanStart,this.onPanUpdate,this.onPanEnd,		//不区分方向拖动手势回调函数
          this.onScaleStart,this.onScaleUpdate,this.onScaleEnd,		//缩放手势回调函数
          this.behavior,
        })
  • Visibility

    控制是否显示组件,以及在隐藏子部件时是否保留其状态、动画、大小、语义和交互性

    • 主要参数

      const Visibility({
          Key? key,
          required this.child,		//必需参数,需要控制可见性的组件
          this.replacement = const SizedBox.shrink(),		//visible为false时的替代组件,默认为一个0大小的空盒
          this.visible = true,		//是否可见,默认为可见
          this.maintainState = false,		//隐藏时是否保持状态
          this.maintainAnimation = false,		//隐藏时是否保持动画
          this.maintainSize = false,		//隐藏时是否保持大小
          this.maintainSemantics = false,		//隐藏时是否保持语义
          this.maintainInteractivity = false,		//隐藏时是否保持交互性
        }) : assert(child != null),
             assert(replacement != null),
             assert(visible != null),
             assert(maintainState != null),
             assert(maintainAnimation != null),
             assert(maintainSize != null),
             assert(		//确保在保持状态的情况下才能保持其他的
               maintainState == true || maintainAnimation == false,
               'Cannot maintain animations if the state is not also maintained.',
             ),
             assert(
               maintainAnimation == true || maintainSize == false,
               'Cannot maintain size if animations are not maintained.',
             ),
             assert(
               maintainSize == true || maintainSemantics == false,
               'Cannot maintain semantics if size is not maintained.',
             ),
             assert(
               maintainSize == true || maintainInteractivity == false,
               'Cannot maintain interactivity if size is not maintained.',
             ),
             super(key: key);

三、布局组件

  • ListView

    • 主要参数

      ListView({
        Key? key,
        
        //可滚动widget公共参数
        Axis scrollDirection = Axis.vertical,		//滚动方向,默认为垂直方向
        bool reverse = false,		//是否反向滚动
        ScrollController? controller,		//滚动行为控制器
        bool? primary,		//是否为主滚动视图
        ScrollPhysics? physics,		//滚动物理特性
        EdgeInsetsGeometry? padding,		//内边距
        
        //ListView各个构造函数的共同参数  
        bool shrinkWrap = false,		//是否根据子组件的总长设置滚动视图大小
        double? itemExtent,		//各子组件的固定高度,和 prototypeItem 互斥,选其一
        Widget? prototypeItem,		//列表项原型子组件,和 itemExtent 互斥,选其一
        bool addAutomaticKeepAlives = true,		//是否自动保持子组件的活动状态
        bool addRepaintBoundaries = true,		//是否为每个子组件添加重绘边界
        bool addSemanticIndexes = true,		//是否为每个子组件添加语义索引
        double? cacheExtent,		// 预渲染区域长度
          
        List<Widget> children = const <Widget>[],		//子widget列表
        ...
      })
    • 构造函数

      • ListView():用于创建静态的滚动列表,懒加载(需要加载时布局和绘制)但是子组件应已创建

      • ListView.builder():根据需求动态创建列表项,适用于列表项较多/不确定的情况

          ListView.builder({
            ...
            required IndexedWidgetBuilder itemBuilder,		//必需参数,列表项构造器
            int? itemCount,		//可选参数,列表项总数
            ...
          })
      • ListView.separated():可在生成列表项之间添加分隔组件

          ListView.separated({
            ...
            required IndexedWidgetBuilder itemBuilder,		//必需参数,列表项构造器
            required IndexedWidgetBuilder separatorBuilder,		//必需参数,分隔符构造器
            required int itemCount,		//必需参数,列表项总数
            ...
          })
      • ListView.custom():提供自定义选项构建列表

          const ListView.custom({
            ...
            required this.childrenDelegate,		//必需参数,通过 SliverChildDelegate 对象来管理子项的创建和销毁
            ...
          })
    • 辅助类

      • SliverChildBuilderDelegate:提供一个 NullableIndexedWidgetBuilder builder 函数生成子组件
      • SliverChildListDelegate:提供一个 List<Widget> children 生成子组件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值