Flutter分享
Flutter 简介
Flutter 是 Google 推出并开源的移动应用开发框架,帮助开发者通过一套代码库高效构建多平台应用,支持 iOS、Android、Web、Windows、macOS、Linux、Fuchsia
优点
- 跨平台:增加代码复用,降低开发成本
- 性能:Flutter 直接将 Dart 代码编译为本地代码运行,再调用 skia 绘图引擎代码,和原生一样,这就少了像 reactnative 和 weex 等先转为原生控件,再系统渲染的步骤
- 热重载:修改完代码后 Ctrl+S 就能实时展现在真机界面上,不需要重新安装 apk 包,提高开发效率
缺点
- 脱离不开原生,一些功能不支持,需要原生开发
- 适配问题,可能会有各种各样的适配问题
- 基础库不完善,需要自己写
在现阶段,开始尝试探索和积累沉淀 Flutter 技术能力,逐步的完善,flutter 还是值得尝试一下的,毕竟研发效率就是竞争力。
现状
现在的很多 app 都有进行 flutter 的功能,这是“国内大厂应用在移动端 Flutter 框架使用分析”,地址链接:https://juejin.cn/post/7012382656578977806。
常用网址
Widget
Activity、Fragment、view 在 Flutter 中等价于 Widget.
与 Android view 区别
- Android 中 View 是可变的,当用户交互或数据更新时,可直接调用 View 的 invalidate 方法重绘,达到更新 UI 的目的。
- Flutter 的 widget 是不可改变的因此不能直接更新,而必须使用 Widget 的状态。Flutter 的 widget 分为有状态和无状态两种。它们的核心特性是相同的, 每一帧它们都会重新构建,不同之处在于有状态的 Widget 有一个 State 对象,它可以跨帧存储状态数据并恢复它。
Stateful widgets
Stateless widgets 是不可变的, 这意味着它们的属性不能改变,所有的值都是最终的.
Stateful widgets(有状态的部件) 持有的状态可能在 widget 生命周期中发生变化. 实现一个 stateful widget 至少需要两个类:
- 一个 StatefulWidget 类。
- 一个 State 类。 StatefulWidget 类本身是不变的,但是 State 类在 widget 生命周期中始终存在.
stateful widget 将自身的构建委托给 State 对象,State 对象的 build 函数负责构建该 Widget,当用户交互或数据发生变化时,Widget 状态发生改变,调用 State 的 setState
方法通知它,而后 State 根据当前的状态信息,重新构建 Widget tree
- 在 Android 中,您可以从父级控件调用 addChild 或 removeChild 以动态添加或删除 View。在 Flutter 中,因为 widget 是不可变的,所以没有 addChild。相反,您可以传入一个函数,该函数返回一个 widget 给父项,并通过 布尔值控制该 widget 的创建
- 在 Flutter 中,一个自定义 widget 通常是通过组合其它 widget 来实现的,而不是继承
- 某些 widget 属性需要单个 widget(child),而其它一些属性,如 action,需要一组 widgets (children),用方括号[]表示。
生命周期
- initState () 表示当前 State 将和一个 BuildContext 产生关联,但是此时 BuildContext 没有完全装载完成,如果你需要在该方法中获取 BuildContext ,可以 new Future. delayed (const Duration (seconds: 0, (){//context}); 一下。
- didChangeDependencies () 在 initState () 之后调用,当 State 对象的依赖关系发生变化时,该方法被调用,初始化时也会调用。
- deactivate () 当 State 被暂时从视图树中移除时,会调用这个方法,同时页面切换时,也会调用。onPause 差不多。(已经消失在新版本中)
- dispose () Widget 销毁了,在调用这个方法之前,总会先调用 deactivate ()。
- didUpdateWidge 当 widget 状态发生变化时,会调用。
常用 Widget 和属性
Container:父 view,宽高、背景色、圆角、margin
Padding:EdgeInsets. fromLTRB
Center:居中
TextField:输入框(TextEditingController)
Expanded:填充剩余布局,组件有个参数 flex, 可以实现比例分配。
height 如果不设置界面显示会有问题,如果要设置,又不能准确的计算出结果, 可以使用 ExpandedBoxDecoration: 圆角,需要放在 Container 里,实现边框、圆角、阴影、形状、渐变、背景图像
ShapeDecoration: 实现四个边分别指定颜色和宽度、底部线、矩形边色、圆形边色、体育场(竖向椭圆)、角形(八边角)边色
UnderlineTabindicator: 下划线
EdgeInsets. only
symmetric ({vertical, horizontal}):用于设置对称方向的填充,vertical 指 top 和 bottom,horizontal 指 left 和 right。Flutter 中官方提供 CustomScrollView,让我们能够作何 Appbar 折叠的效果,并且很容易就能实现下拉刷新和加载更多。
dialog 高度设置不生效将 showBottomsheet 更换成 showAdjustableBottomSheet
MediaQuery. removePadding 可以移除组件的边距,有些组件自带有边距
expenand 必须和 colum 或 row 一起用,否则 debug 能运行,release 报错。
1 |
|
点击
- 在 Flutter 中,添加触摸监听器有两种方法: 如果 Widget 支持事件监听,则可以将一个函数传递给它并进行处理。例如,RaisedButton 有一个 onPressed 参数
- 如果 Widget 不支持事件监听,则可以将该 Widget 包装到 GestureDetector 中,并将处理函数传递给 onTap 参数。
- InkWell:点击,和 GestureDetector 区别,即使 InkWell 没有子控件,它仍然可以响应点击操作并执行相应的操作或触发回调函数。
MaterialApp
MaterialApp 是我们使用 Flutter 开发中最常用的符合 Material Design 设计理念的入口 Widget。你可以将它类比成为网页中的