Android Developer 入门FLutter 整理

 Flutter 依赖于 Android 操作系统的多种功能和配置

视图 (Views)

FLutter框架是声明式UI 参考

Win32 到 Web 再到 Android 和 iOS 是属于命令式UI

widget 或它们的状态变化时, Flutter 框架都会创建一个新的 widget 树的实例

Flutter 支持 Material Components 库。它提供实现了 Material Design 设计规范 的 widgets。

Material Design 是一套 为所有平台优化 (包括 iOS)的灵活的设计系统。

如何更新 widgets

 Widget 是不可变的,无法被直接更新,你需要操作 Widget 的状态。

有状态 (Stateful) 和无状态 (Stateless) Widget

StatefulWidget 有一个跨帧存储和恢复状态数据的 State 对象

Layout widgets

布局中添加或删除一个组件

通过布尔标记值控制子 Widget 的创建,返回一个 Widget 的父 Widget 传入一个方法

Widget 如何实现动画

Animation<double> 的子类 AnimationController 来暂停、播放、停止以及逆向播放动画

Ticker 在垂直同步 (vsync) 的时候发出信号

运行的时候创建一个介于 0 和 1 之间的线性插值

可以创建一个或多个 Animation,并将它们绑定到控制器上

Canvas 进行绘制

绘制的类:CustomPaint 和 CustomPainter

CustomPainter实现自定义的绘制算法

自定义 Widget

 组合 更小的 Widget 来创建自定义 Widget

Intent 在 Flutter 中的对应概念是什么

使用 Navigator 和 Route 在同一个 Activity 内的不同界面间进行跳转

Route 是应用内屏幕和页面的抽象,Navigator 是管理路径 route 的工具

Navigator 可以通过对 route 进行压栈和弹栈操作实现页面的跳转。

Navigator 的工作原理和栈相似, route 压栈 (push()),route 弹栈 (pop())

在 Flutter 中应该如何处理从外部应用接收到的 intent?

Flutter 可以通过直接和 Android 层通信并请求分享的数据来处理接收到的 Android intent。

 AndroidManifest.xml 中注册 intent 过滤器

MainActivity 中处理 intent,提取出其它 intent 分享的文本并保存。

Flutter 准备好处理的时候,它会使用一个平台通道请求数据,数据便会从原生端发送过来

Widget 渲染的时候,从 Flutter 这端请求数据

startActivityForResult() 的对应方法是什么?

Navigator 类负责 Flutter 的导航,并用来接收被压栈的 route 的返回值。这是通过在 push() 后返回的 Future 上 await 来实现的。

异步 UI

Dart 有一个单线程执行的模型

支持 Isolate (在另一个线程运行 Dart 代码的方法)

Isolate 是一个事件循环和异步编程方式

如何将任务转移到后台线程?

 Flutter 是单线程并且运行一个事件循环

无须担心线程的管理以及后台线程的创建

执行和 I/O 绑定的任务(例如存储访问或者网络请求,那么你可以安全地使用 async/await

你需要执行消耗 CPU 的计算密集型工作,那么你可以将其转移到一个 Isolate 上以避免阻塞事件循环

Isolate 来利用多核处理器的优势执行耗时或计算密集的任务

Isolate 是独立执行的线程,不会和主执行内存堆分享内存。

OkHttp 在 Flutter 中的对应物是什么?

Flutter 中使用流行的 http 包 进行网络请求

如何为耗时任务显示进度?

使用 ProgressIndicator widget。通过代码逻辑使用一个布尔标记值控制进度条的渲染。

build 方法被拆分成三个不同的方法。如果 showLoadingDialog() 返回 true(当 widgets.length == 0),渲染 ProgressIndicator。否则,在 ListView 里渲染网络请求返回的数据。

在哪里放置分辨率相关的图片文件?

Flutter 遵循一个简单的类似 iOS 的密度相关的格式。文件可以是一倍 (1.0x)、两倍 (2.0x)、三倍 (3.0x) 或其它的任意倍数。

Flutter 没有 dp 单位,但是有逻辑像素尺寸,基本和设备无关的像素尺寸是一样的。

字符串储存在哪里?如何处理本地化?

Flutter 当下并没有一个特定的管理字符串的资源管理系统。

将字符串作为静态域存放在类中,并通过类访问它们。

Flutter 开发者使用 intl 包 进行国际化和本地化。

Gradle 文件的对应物是什么?我该如何添加依赖?

在 pubspec.yaml 文件中定义在 Flutter 里使用的外部依赖。 pub.dev 是查找 Flutter packages 的好地方

如何监听 Android Activity 的生命周期事件?

绑定 WidgetsBinding 观察者并监听 didChangeAppLifecycleState() 的变化事件来监听生命周期。

可以被观察的生命周期事件有:

  • inactive — 应用处于非活跃状态并且不接收用户输入。这个事件只适用于 iOS,Android 上没有对应的事件;

  • paused — 应用当前对用户不可见,无法响应用户输入,并运行在后台。这个事件对应于 Android 中的 onPause()

  • resumed — 应用对用户可见并且可以响应用户的输入。这个事件对应于 Android 中的 onPostResume()

  • suspending — 应用暂时被挂起。这个事件对应于 Android 中的 onStop; iOS 上由于没有对应的事件,因此不会触发此事件。

LinearLayout 的对应概念是什么?

Row 或者 Column Widget 来实现相同的效果。

RelativeLayout 的对应概念是什么?

组合使用 Column、Row 和 Stack Widget 实现 RelativeLayout 的效果。

ScrollView 的对应概念是什么?

实现这个功能的最简单的方法是使用 ListView widget。

在 Flutter 中如何处理屏幕旋转?

FlutterView 会处理配置的变化,前提条件是在 AndroidManifest.xml 文件中声明了:

android:configChanges="orientation|screenSize"

Flutter 中如何为一个 Widget 添加点击监听器?

如果 Widget 支持事件监听,那么向它传入一个方法并在方法中处理事件。例如,RaisedButton 有一个 onPressed 参数

如果 Widget 不支持事件监听,将 Widget 包装进一个 GestureDetector 中并向 onTap 参数传入一个方法。

如何处理 Widget 上的其它手势?

使用 GestureDetector 可以监听非常多的手势,例如:

  • Tap

    • onTapDown - 一个可能产生点击事件的指针触摸到屏幕的特定位置。

    • onTapUp - 一个产生了点击事件的指针停止触摸屏幕的特定位置。

    • onTap - 一个点击事件已经发生。

    • onTapCancel - 之前触发了 onTapDown 事件的指针不会产生点击事件。

  • Double tap

    • onDoubleTap - 用户在屏幕同一位置连续快速地点击两次。

  • Long press

    • onLongPress - 指针在屏幕的同一位置保持了一段较长时间的触摸状态。

  • Vertical drag

    • onVerticalDragStart - 指针已经触摸屏幕并可能开始垂直移动。

    • onVerticalDragUpdate - 触摸屏幕的指针在垂直方向移动了更多的距离。

    • onVerticalDragEnd - 之前和屏幕接触并垂直移动的指针不再继续和屏幕接触,并且在和屏幕停止接触的时候以一定的速度移动。

  • Horizontal drag

    • onHorizontalDragStart - 指针已经触摸屏幕并可能开始水平移动。

    • onHorizontalDragUpdate - 触摸屏幕的指针在水平方向移动了更多的距离。

    • onHorizontalDragEnd - 之前和屏幕接触并水平移动的指针不再继续和屏幕接触,并且在和屏幕停止接触的时候以一定的速度移动。

ListView 在 Flutter 中的对应概念是什么?

因为 Flutter widget 不可变的特点,你需要向 ListView 传入一组 widget, Flutter 会保证滑动的快速顺畅。

如何知道点击了哪个列表项?

使用传入 widget 的触摸监听。

如何动态更新 ListView?

在 Flutter 中,如果你准备在 setState() 里更新一组 widget,你很快会发现你的数据并没有更新到界面上。这是因为当 setState() 被调用的时候, Flutter 渲染引擎会查看 Widget 树是否有任何更改。当引擎检查到 ListView,他会执行 == 检查,并判断两个 ListView 是一样的。没有任何更改,所以也就不需要更新。

推荐的高效且有效的创建一个列表的方法是使用 ListView.Builder。这个方法非常适用于动态列表或者拥有大量数据的列表。

如何为 Text Widget 设置自定义字体?

将字体文件放入一个文件夹,并在 pubspec.yaml 文件中引用它,就和导入图片一样。

如何更改 Text Widget 的样式?

Text Widget 的样式参数接收一个 TextStyle 对象,你可以在这个对象里自定义很多参数,例如:

  • color
  • decoration
  • decorationColor
  • decorationStyle
  • fontFamily
  • fontSize
  • fontStyle
  • fontWeight
  • hashCode
  • height
  • inherit
  • letterSpacing
  • textBaseline
  • wordSpacing

如何使用 GPS 传感器?

如何使用相机?

如何使用 Facebook 登录?

如何使用 Firebase 的功能?

官方插件 提供了 Firebase 的大多数功能。这些插件都是由 Flutter 团队维护的官方集成插件:

你可以在 Pub 网站上查找一些官方插件没有直接支持的功能的第三方 Firebase 插件。

如何创建自己的自定义原生集成插件?

开发包和插件

如何在 Flutter 应用中使用 NDK?

如果你在现有的 Android 应用中使用 NDK,并且希望你的 Flutter 应用可以利用你的 native 库,这可以通过创建一个自定义插件实现。

你的自定义插件首先和你的 Android 应用通信,Android 应用会通过 JNI 调用 native 方法。一旦有返回值,就可以向 Flutter 发送回一个消息并渲染结果。

暂时还不支持从 Flutter 中直接调用 native 代码。

在 Flutter 中如何使用 SQLite?

如何使用 Shared Preferences?

如何设置推送通知?

参考:https://flutter.cn/docs/get-started/flutter-for/android-devs

猜你喜欢

转载自blog.csdn.net/u013491829/article/details/109430482