给 Android 开发者的 Flutter 指南
这篇文档旨在帮助 Android 开发者利用既有的 Android 知识来通过 Flutter 开发移动应用。如果你了解 Android 框架的基本知识,你就可以使用这篇文档作为 Flutter 开发的快速入门。
你的 Android 知识和技能对于 Flutter 开发是非常有用的,因为 Flutter 依赖于 Android 操作系统的多种功能和配置。Flutter 是一种全新的构建移动界面的方式,但是它有一套和 Android(以及 iOS)进行非 UI 任务通信的插件系统。如果你是一名 Android 专家,你就不必重新学习所有知识才能使用 Flutter。
Android当中的View在Flutter当中是什么
Android 中的 View 是显示在屏幕上的一切的基础。按钮、工具栏、输入框以及一切内容都是 View。而 Flutter 中 View 的大致对应物是 Widget。Widget 并非完全对应于 Android 中的 View,但是在你熟悉 Flutter 的工作原理的过程中可以把它们看做“声明和构建 UI 的方式”。然而,Widget 和 View 还是有一些差异。首先,Widget 有着不一样的生命周期:它们是不可变的,一旦需要变化则生命周期终止。任何时候 Widget 或它们的状态变化时,Flutter 框架都会创建一个新的 Widget 树的实例。对比来看,一个 Android View 只会绘制一次,除非调用 invalidate 才会重绘。Flutter 的 widget 很轻量,部分原因在于它们的不可变性。因为它们本身既非视图,也不会直接绘制任何内容,而是 UI 及其底层创建真正视图对象的语义的描述。Flutter 支持 Material Components 库。它提供实现了 Material Design 设计规范 的 widgets。 Meterial Design 是一套 为所有平台优化 (包括 iOS)的灵活的设计系统。Flutter 非常灵活、有表达能力,它可以实现任何设计语言。例如,在 iOS 平台上,你可以使用 Cupertino widgets 创建 Apple 的 iOS 设计语言 风格的界面。
Android的更新状态跟Flutter更新组件的区别
在 Android 中,你可以直接操作更新 View。然而在 Flutter 中,Widget 是不可变的,无法被直接更新,你需要操作 Widget 的状态。
这就是有状态 (Stateful) 和无状态 (Stateless) Widget 概念的来源。StatelessWidget 如其字面意思—没有状态信息的 Widget。
StatelessWidget 用于你描述的用户界面的一部分不依赖于除了对象中的配置信息以外的任何东西的场景。
例如在 Android 中,这就像显示一个展示图标的 ImageView。这个图标在运行过程中不会改变,所以在 Flutter 中就使用 StatelessWidget。
如果你想要根据 HTTP 请求返回的数据或者用户的交互来动态地更新界面,那么你就必须使用 StatefulWidget,并告诉 Flutter 框架 Widget 的状态 (State) 更新了,以便 Flutter 可以更新这个 Widget。
这里需要着重注意的是,无状态和有状态的 Widget 本质上是行为一致的。它们每一帧都会重建,不同之处在于 StatefulWidget 有一个跨帧存储和恢复状态数据的 State 对象。
如果你有疑问,那么记住这条规则:如果一个 Widget 会变化(例如由于用户交互),它是有状态的。然而,如果一个 Widget 响应变化,它的父 Widget 只要本身不响应变化,就依然是无状态的。
如何布局 Widget?我的 XML 布局文件在哪里?
在 Android 中,你通过 XML 文件定义布局,但是在 Flutter 中,你是通过一个 Widget 树来定义布局的。以下示例展示了如何显示一个带有填充 (padding) 的简单 Widget:
如何在布局中添加或删除一个组件?
在 Android 中,你通过调用父 View 的 addChild() 或 removeChild() 方法动态地添加或者删除子 View。在 Flutter 中,由于 Widget 是不可变的,所以没有 addChild() 的直接对应的方法。不过,你可以给返回一个 Widget 的父 Widget 传入一个方法,并通过布尔标记值控制子 Widget 的创建。
例如,下面就是你可以如何在点击一个 FloatingActionButton 的时候在两个 Widget 之间切换。
import 'package:flutter/material.dart';void main() { runApp(SampleApp());}class SampleApp extends StatelessWidget { // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp( title: 'Sample App', theme: ThemeData( primarySwatch: Colors.blue, ), home: SampleAppPage(), ); }}class SampleAppPage extends StatefulWidget { SampleAppPage({Key key}) : super(key: key); @override _SampleAppPageState createState() => _SampleAppPageState();}class _SampleAppPageState extends State { // Default value for toggle bool toggle = true; void _toggle() { setState(() { toggle = !toggle; }); } _getToggleChild() { if (toggle) { return Text('Toggle One'); } else { return MaterialButton(onPressed: () {}, child: Text('Toggle Two')); } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("Sample App"), ), body: Center( child: _getToggleChild(), ), floatingActionButton: FloatingActionButton( onPressed: _toggle, tooltip: 'Update Text', child: Icon(Icons.update), ), ); }}
Intent 在 Flutter 中的对应概念是什么?
在 Android 中,Intent 主要有两个使用场景:在 Activity 之前进行导航,以及组件间通信。 Flutter 却没有 intent 这样的概念,但是你依然可以通过原生集成 (插件) 来启动 intent。
Flutter 实际上并没有 Activity 和 Fragment 的对应概念。在 Flutter 中你需要使用 Navigator 和 Route 在同一个 Activity 内的不同界面间进行跳转。
Route 是应用内屏幕和页面的抽象,Navigator 是管理路径 route 的工具。一个 route 对象大致对应于一个 Activity,但是它的含义是不一样的。Navigator 可以通过对 route 进行压栈和弹栈操作实现页面的跳转。Navigator 的工作原理和栈相似,你可以将想要跳转到的 route 压栈 (push()),想要返回的时候将 route 弹栈 (pop())。
在 Android 中,在应用的 AndroidManifest.xml 文件中声明 Activity。
在 Flutter 中,你有多种不同的方式在页面间导航:
- 定义一个 route 名字的 Map。(MaterialApp)
- 直接导航到一个 route。(WidgetApp)
看了这些是不是安卓开发上手Flutter开发就容易多了。喜欢就点赞收藏关注哈,后面陆续更新。