原因:在flutter中,键盘弹起时系统会缩小Scaffold的高度并重建
成都创新互联"三网合一"的企业建站思路。企业可建设拥有电脑版、微信版、手机版的企业网站。实现跨屏营销,产品发布一步更新,电脑网络+移动网络一网打尽,满足企业的营销需求!成都创新互联具备承接各种类型的网站设计、成都网站建设项目的能力。经过十多年的努力的开拓,为不同行业的企事业单位提供了优质的服务,并获得了客户的一致好评。
1)把Scaffold的resizeToAvoidBottomInset属性设置为false,这样在键盘弹出时将不会resize
2)把写死的高度改为 原高度 - MediaQuery.of(context).viewInsets.bottom ,键盘弹出时布局将重建,而这个 MediaQuery.of(context).viewInsets.bottom 变量在键盘弹出前是0,键盘弹起后的就是键盘的高度
将输入框放进可滚动的Widget中即可,当输入框获取焦点后,系统会自动将它滑动到可视区域
应该是TextField作为一个Widget,被滑出屏幕,又滑回来,没有焦点的Widget的initState和build方法会被重新执行,也就是Widget会被重建,重建时原有的状态不会自动恢复,里面的文字自然就消失了,解决方法是把flutterlistviewitem封装成一个StatefulWidget,然后用AutomaticKeepAliveClientMixin来保证TextField不会被回收。
State 的生命周期,指的是在用户参与的情况下,其关联的 Widget 所经历的,从创建到显示,再到更新最后到停止,直至销毁等各个阶段
不同的阶段涉及到特定的任务处理
State 的生命周期流程如下图所示
由图可知:State 的生命周期可以分为三个阶段:创建(插入视图树)、更新(在视图树中存在)、销毁(从视图树中移除)
State 初始化时会依次执行:构造方法 - initState - didChangeDependencies - build,随后完成页面渲染
Widget 的状态更新,主要由 setState、didChangeDependencies 和 didUpdateWidget 触发
一旦这三个方法被调用,Flutter 随后便会销毁旧的 Widget,并调用 build 方法重建 Widget
组件销毁相对创建和更新而言更简单。比如页面销毁时或是组件被移除时,系统会调用 deactivate 和 dispose 这两个方法,来移除或销毁组件
与iOS的ViewController、Android的Activity一样,Flutter中的Widget也存在生命周期,并且通过State来提现。而App则是一个特殊的Widget,除了需要处理视图显示的各个阶段,还需要应对应用从启动到退出所经历的各个状态。
State的生命周期,指的是在用户参与的情况查下,其关联的Widget所经历的从创建到显示再到更新最后到停止,直至销毁的各个过程阶段。
这些不同的阶段涉及到的特定的任务处理,正确理解State的生命周期至关重要,State的生命周期流程图图,如下所示:
从图中可以看到,State的生命周期可以分为3个阶段:创建、更新、销毁。下面将介绍每一个阶段的具体流程
State初始化时会依次执行:构造方法 - initState - didChangeDependencies - build,随后完成页面渲染
Widget的状态更新,主要由3个方法触发:setState、didChangeDependencies与didUpdateWidget。
一旦这三个方法被调用,Flutter就回销毁旧的Widget,并调用build方法重建Widget
组件销毁相对比较简单,组件被移除,或者页面销毁的时候,系统会调用deactivate和dispose这两个方法来移除或销毁组件
下面这张表格也可以帮助我们理解记忆这些调用实际
视图的生命周期,定义了视图的加载到构建的全过程,其回调机制能够确保我们可以更具视图的状态选择合适的时间做恰当的事情,而App的生命周期,则定义了App从启动到退出的全过程
在原生Android、iOS开发中,有时我们需要再对应的App生命周期事件中做相应的处理,比如App从后台进入前台,从前台退出后台,或者在UI绘制完成后做一些处理。
这样的需求,在原生开发中,可以通过重写Activity、ViewController生命周期回调方法,或者是注册应用程序的相关通知来兼容App的生命周期并做相应的处理。而在Flutter中,我们可以利用WidgetsBindingObserver类,来实现同样的需求。
下面我们看看WidgetsBindingObserver中具体有哪些回调函数:
didChangeAppLifecycleState回调函数中,有一个参数类型为AppLifecycleState的枚举类型,这个枚举类型是Flutter对App生命周期状态的封装,它的常用状态包括:
可以将App切前后台,控制台输出的App状态,可以发现:
我们可以通过下面的这张图直观的了解状态切换过程
除了需要监听App的生命周期回调做相应处理外,根据不同的需求,我们需要再组件宣讲之后做一些与显示安全相关的操作,在iOS中,可以通过GCD的方法,让操作在下一个RunLoop执行,在Android中,可以通过View.post()插入消息队列,来保证在组件渲染后进行相关操作。在Flutter中实现同样的需求会更简单:使用WidgetsBinding来实现即可
WidgetsBinding提供了单词Frame绘制回调和实时Frame绘制回调两种机制来满足不同的需求场景: