flutter-开发中,各种组件的应用场景【一】

记录一下,解决不同应用场景的需求中各种组件的应用,这里不涉及原理,及详细解析。

场景1:组件需要点击事件

InkWell组件
------------------------------
InkWell(
        onTap: (){
          print("点击事件");
        },
        child: Text("需要添加点击事件的组件"),
      )
------------------------------

InkResponse组件
------------------------------
InkResponse(
              onTap: (){
                print("点击事件");
              },
              child: Text("需要添加点击事件的组件"),
            )

------------------------------

GestureDetector组件
------------------------------
GestureDetector(
        onTap: (){
          print("点击事件");
        },
        child: Text("需要添加点击事件的组件"),
      )
------------------------------

区别:

1.三种点击效果有所区别,InkWell水波纹,InkResponse圆形,GestureDetector无明显效果
2. 平时一般使用InkWell就行了, GestureDetector手势事件比较多。
3.三种点击区域有所差别,对margin,及pading区域的事件响应不同。
4.后续补充

场景2:布局需要背景色,背景图,圆角,阴影及边框,这里用Container实现

Container的背景色,背景图,圆角,阴影及边框的设置

------------------------------
Container(
        height: 300,
        width: 300,
        decoration: BoxDecoration(
          ///背景色
          color: ToolColorRandomColor(),
          ///圆角
          borderRadius: BorderRadius.circular(10),
          ///边框
          border: Border.all(color: Colors.black, width: 1),
          ///阴影
          shape: BoxShape.rectangle,
          boxShadow: [
            BoxShadow(
              color: Colors.red,
              offset: Offset(-1, -1),
              blurRadius: 1,
            )
          ],
          ///背景图
          image: DecorationImage(
            image: AssetImage(
                'assets/images/profile_third_24x26.png'),
            fit: BoxFit.fill,
          ),
        ),

        child: Center(child: Text("Container的背景图,圆角及边框的设置"),),
      )

------------------------------

WechatIMG120.jpeg

注意点:

1.在圆角及边框同时存在时,且并不是全部边框,或全部边框颜色不一致,设置圆角会报错
2.后续补充

场景3:需要显示圆形的图

CircleAvatar组件【效果图1】

------------------------------
CircleAvatar(
        backgroundImage: NetworkImage("https://imagecloud.thepaper.cn/thepaper/image/210/561/140.jpg"),
        radius: ToolScreenUtilSetWidth(100),
      )

------------------------------

ClipOval 组件【效果图2】

------------------------------

class _MyClipper extends CustomClipper<Rect>{
  @override
  Rect getClip(Size size) {
    return new Rect.fromLTRB(0, 0, 200, 200);
  }

  @override
  bool shouldReclip(CustomClipper<Rect> oldClipper) {
    return false;
  }
}

------------------------------

ClipOval(
        clipper: _MyClipper(),
        child: Image.network("https://imagecloud.thepaper.cn/thepaper/image/210/561/140.jpg"),
      )

------------------------------

效果图1.jpeg
效果图2.jpeg

区别:

1.需要使用圆形图片时,最好使用CircleAvatar,比较方便使用,ClipOval默认剪裁的是椭圆形。

2. ClipOval的优势是可以用于自定义区域大小剪裁椭圆,同理还有ClipRect,剪裁矩形。

3.后续补充

场景4:部分业务需要在某一状态显示和隐藏组件

Offstage组件

Offstage(
  offstage: true,
  child: Text("需要隐藏的组件"),
  ),

Visibility组件

Visibility(
  visible: true,
  child: Text("需要隐藏的组件"),
),


区别:

1.Offstage组件,可以实现widget大小为0,GONE的效果,也可以满足动态添加的需求。如果offstage为true表示隐藏,默认是true。

2.Visibility组件,不仅可以实现GONE的效果,还可以实现INVISIBLE的效果,即不显示但还占据空间。还有更多功能,比如隐藏后是否响应事件等等。如果visible是true代表显示,否则隐藏。

3.Visibility组件,默认隐藏是不占据空间的,如果想保留空间大小,需要添加几个属性Visibility(
  visible: true,
  maintainAnimation: true,
  maintainSize: true,
  maintainState: true,
  child: Text("补测"),
),
其中maintainSize就是保持大小不变,但是单独设置这一个不行,会报错,maintainAnimation和maintainState也需要同时设置。

4.后续补充

场景5:appBar显示的隐藏比较特殊,直接使用Offstage会报错,需要外面包裹PreferredSize使用。

------------------------------------
 appBar: PreferredSize(
      child: Offstage(
        offstage: false,
        child: AppBar(
          title: Text("标题"),
        ),
      ),
      preferredSize: Size.fromHeight(MediaQuery.of(context).size.height * 0.07),
    )

-----------------------------------

扩展:

PreferredSize此控件不对其子控件施加任何约束,并且不以任何方式影响孩子的布局。
常用来自定义AppBar和AppBar.bottom(PreferredSize子控件为AppBar或者AppBar.bottom)

Scaffold(
        appBar: PreferredSize(
          preferredSize: Size.fromHeight(200),
          child: Container(
            color: Colors.blue,
          ),
        ),
        body: Test1(),
      )
 
AppBar.bottom通常是TabBar等,通过PreferredSize可设置为任意组件:

Scaffold(
  appBar: AppBar(
    bottom: PreferredSize(
      preferredSize: Size.fromHeight(48),
      child: Container(
        height: 48,
        color: Colors.red,
      ),
    ),
  ),
  body: Test1(),
)

场景6:键盘删除事件

在当前页面最外层包裹
-----------------------------------
RawKeyboardListener(
          autofocus: true,
          onKey: (event) {
            print("键盘----event=${event.toString()}");
            if (event.runtimeType == RawKeyDownEvent) {
              if (event.physicalKey == PhysicalKeyboardKey.enter) {
              } else if (event.physicalKey == PhysicalKeyboardKey.backspace) {
         
              }
            }
          },
child:Text("需要监听键盘删除的页面"),
)
在TextField的onChanged中判断value为空时识为删除
-----------------------------------
onChanged: (value) {
                      if (!gameGridFile.value.isComposingRangeValid) {
                        print("输入了---${value}");
                      }
                    },

吐槽:

没有找到特别适合的监听事件。

场景7:准确获得键盘输入的汉字,因为键盘输入,涉及到拼音事件,不经过过滤的话,获取到的输入不准确

在TextField的onChanged中
-----------------------------------
onChanged: (value) {
                      if (!gameGridFile.value.isComposingRangeValid) {
                        print("输入了---${value}");
                      }
                    },
-----------------------------------

场景8:不需要表情的输入,需要输入的表情屏蔽

在TextField中设置

RegExp regexp = RegExp(
      "[^\\u0020-\\u007E\\u00A0-\\u00BE\\u2E80-\\uA4CF\\uF900-\\uFAFF\\uFE30-\\uFE4F\\uFF00-\\uFFEF\\u0080-\\u009F\\u2000-\\u201f\r\n]");
-----------------------------------

inputFormatters: [FilteringTextInputFormatter.deny(regexp)],

-----------------------------------

场景9:在多输入框时需要手动对输入框焦点进行变换

///存储焦点
List gameGridViewFocusNodeList = [];
FocusNode focusNode = FocusNode();
gameGridViewFocusNodeList.add(focusNode);

///获取index焦点,更改焦点
FocusNode focusNode = gameGridViewFocusNodeList[index];
focusNode.requestFocus();

场景10:键盘弹出时,布局需要相应的变化,防止被遮挡,需要对键盘高度进行监听

///初始化方法
  void initState() {
    super.initState();
    ///监听键盘高度变化
    WidgetsBinding.instance.addObserver(this);
  }

@override
  void didChangeMetrics() {
    super.didChangeMetrics();
    WidgetsBinding.instance.addPostFrameCallback((_) {
      print('键盘高度---${MediaQuery.of(context).viewInsets.bottom}');
    });
  }

///析构
  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }

场景11:在布局时外层因为需要自适应高度,内层也有需要自适应的child,同层级存在已知高度的child,如果不做处理,内层自适应的child会撑满外层布局,使用IntrinsicHeight组件可以统一内层child的高度【选取同层级最高的,已设置高度的child不受影响】

IntrinsicHeight组件

效果图1
-----------------------------------
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
      children: [
        Container(
          width: 50,
          color: ToolColorRandomColor(),
        ),
        Container(
          height: 100,
          width: 50,
          color: ToolColorRandomColor(),
        ),
        Container(
          width: 50,
          color: ToolColorRandomColor(),
        ),
          Container(
            width: 50,
            height: 200,
            color: ToolColorRandomColor(),
          )
      ],
    );

效果图2
-----------------------------------

IntrinsicHeight(
      child: Row(
        mainAxisAlignment: MainAxisAlignment.spaceBetween,
        children: [
          Container(
            width: 50,
            color: ToolColorRandomColor(),
          ),
          Container(
            height: 100,
            width: 50,
            color: ToolColorRandomColor(),
          ),
          Container(
            width: 50,
            color: ToolColorRandomColor(),
          ),
          Container(
            width: 50,
            height: 200,
            color: ToolColorRandomColor(),
          )
        ],
      ),
    );

效果图1.jpeg
效果图2.jpeg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,753评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,668评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,090评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,010评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,054评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,806评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,484评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,380评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,873评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,021评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,158评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,838评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,499评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,044评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,159评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,449评论 3 374
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,136评论 2 356

推荐阅读更多精彩内容