现学flutter开发一个app (3)

最近闲来无事学习flutter模仿开发一个应用用来练手, 准备将学习过程记录成一系列文章备忘, 本文为该系列第(3)篇,全部代码已上传: github 界面布局就不再一一记录,之后主要记录下特别的地方

导航

  1. showModalBottomSheet
  2. 键盘遮盖问题解决

showModalBottomSheet

商品详情页面有一个bottomSheet显示商品规格,数量信息


image.png
showModalBottomSheet(
            context: context,
            builder: (context) {
              return ActivitySelectSpec(
                info: info,
                skus: skus,
                addShoppingCart: true,
              );
            });

键盘遮盖问题解决

这里由于是modalBottomSheet存在一个问题是底部数量输入框获取焦点是会被键盘遮住..

正常界面在scaffold里有一个resizeToAvoidBottomInset参数默认是true, 该参数控制键盘弹出时会重绘界面以防界面中元素被键盘遮挡. 但是在showModalBottomSheet中产生的widget是无效的


image.png

方案一 :

在showModalBottomSheet的builder中嵌套一个scaffold解决键盘遮挡问题. 效果如下


iphone5s

小屏幕下由于本身元素已经布满弹出窗口所以并没什么问题.


iphone xs max

大屏情况下,键盘弹出问题是解决没问题, 但是会看弹出框无法布满底部会出现空白. 解决这种方法有控制弹出窗scaffold大小,并不知道内部控件大小,

⚠️ 这种方法当android:theme为 @android:style/Theme.Light.NoTitleBar.Fullscreen 时无效, 为@android:style/Theme.Light.NoTitleBar时有效.. Fullscreen会影响这个效果 .. 如果想全屏只能initState时设置 SystemChrome.setEnabledSystemUIOverlays([]);

该方案可以解决键盘遮挡问题但会倒是布局不雅.. 目前本人测试可多种布局都无法解决空白问题, 哪位大神知道解决方法的可以告知一下

方案二 :

既然常规方案无法完成遮挡处理那就手工来控制
效果如下:


image.png

image.png

大小屏都没问题.

解决思路如下:

当键盘触发时在整体布局底部padding加大底部变动区域,也就是修改整体界面的显示区域接口,原因是滚动界面会记入当前的滚动keepScrollOffset会自动调整显示区到当前获取焦点.

弃用纯手工解决方案

当键盘出发弹出时在整个界面下方插入一个键盘使得显示界面变动区域,其值可以通过 MediaQuery.of(context).viewInsets.bottom 获取.
取到值之后还需要对界面进行滚动,因为如果单纯只是插入一块区域,并不能完全的让键盘不遮挡,只不过是整个界面长度滚动到最下面的时候键盘不遮挡元素而已

代码如下:

double viewport; //无键盘时显示区域
double maxScroll; //无键盘是最大滚动区域
 void _keyBorderShow() {
    if (_focusNode.hasFocus) {
      Future.delayed(Duration(milliseconds: 150), () {
        double move = _controller.position.maxScrollExtent; // 移动到最底部
        if (maxScroll == 0) {
          //单界面就显示完成的. 按显示区域变动值移动
          move = _controller.position.viewportDimension - viewport + 10;
          if (move < 11) {
            move = _controller.position.maxScrollExtent;
          }
        } else {
          //原本就有滚动距离的,按多出来的距离移动
          move = _controller.position.maxScrollExtent - maxScroll + 10;
        }
        if (_controller.position.maxScrollExtent < move) {
          move = _controller.position.maxScrollExtent;
        }
        _controller.jumpTo(move);
      });
    }
  }

分为2种情况:
1.没有键盘时一个界面就显示完成了,那么控制器取到的最大滚动值就是0那也就需要计算显示区域变动了多少,然后滚动多少.
2. 没有键盘是一个界面显示不完原本就有滚动值,那就需要计算新的最大滚动值和原本的滚动值变化了多少,就滚动多少
这里使用了150毫秒的延时,是为了在键盘显示时等待键盘新界面绘制完成,获取新界面的值.

⚠️ 注意: 这些代码不能通用,只能说是一个解决思路可以参考

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