初识Flutter
Flutter 是由 Google 开发的开源 UI 软件开发工具包,用于构建跨平台的高性能程序。它允许开发者使用单一代码库创建适用于 iOS、Android、Web 和桌面平台的应用。对于 iOS 开发者来说,使用 Flutter 开发应用后,可以通过工具如来简化应用的打包和上传流程,提升开发效率。Flutter 是一个由 Google 推出的开源 UI 软件开发工具包,旨在帮助开发者以高效的方
Flutter 整体简单介绍
Flutter 是由 Google 开发的开源 UI 软件开发工具包,用于构建跨平台的高性能程序。它允许开发者使用单一代码库创建适用于 iOS、Android、Web 和桌面平台的应用。对于 iOS 开发者来说,使用 Flutter 开发应用后,可以通过工具如 AppUploader 来简化应用的打包和上传流程,提升开发效率。
目录
- Flutter 简介
- 开发环境搭建
- 创建你的第一个 Flutter 项目
- 项目结构解析
- 基础 Widgets
- Stateless Widget vs Stateful Widget
- 布局与设计
- 常用布局 Widgets
- 响应式设计
- 用户输入处理
- 表单与输入控件
- 导航与路由
- 状态管理
- setState
- Provider
- 网络请求与数据处理
* HTTP 请求
* JSON 解析 - 持久化存储
* Shared Preferences
* SQLite - 使用插件与包
- 构建与部署应用
- 调试与测试
- 性能优化
- 附加资源
1. Flutter 简介
Flutter 是一个由 Google 推出的开源 UI 软件开发工具包,旨在帮助开发者以高效的方式构建跨平台应用。它使用 Dart 编程语言,并提供丰富的预制 Widgets,使开发者能够轻松创建漂亮且高性能的用户界面。
主要特点:
- 跨平台支持 :同一代码库可部署到 iOS、Android、Web、Windows、macOS 和 Linux。
- 高性能 :直接编译为原生代码,性能接近原生应用。
- 丰富的 Widgets :内置丰富的 Material Design 和 Cupertino(iOS 风格) Widgets。
- 热重载 :快速查看代码更改的效果,大大提高开发效率。
2. 开发环境搭建
2.1 安装 Flutter SDK
- 下载 Flutter SDK :
前往 Flutter 官方网站 下载适用于你操作系统的 Flutter SDK 压缩包。
- 解压并配置路径 :
将下载的压缩包解压到你选择的目录,并将 Flutter 的 bin 目录添加到系统的环境变量中。
示例(macOS/Linux):
export PATH="$PATH:`pwd`/flutter/bin"
示例(Windows):
将 flutter\bin 路径添加到系统环境变量的 PATH 中。
- 验证安装 :
打开终端或命令提示符,运行以下命令检查 Flutter 是否安装成功:
flutter doctor
这个命令会检查你的开发环境,并列出需要配置的部分。
2.2 安装 Android Studio
- 下载并安装 Android Studio :
前往 Android Studio 官方网站 下载并安装最新版本的 Android Studio。
-
配置 Android Studio :
- 安装 Flutter 和 Dart 插件 :
- 打开 Android Studio。
- 点击 File > Settings(Windows)或 Android Studio > Preferences(macOS)。
- 在左侧菜单中选择 Plugins 。
- 搜索 Flutter ,点击 Install 。安装 Flutter 插件时,Dart 插件会自动安装。
- 安装完成后,重启 Android Studio。
- 安装 Flutter 和 Dart 插件 :
2.3 设置 Android 模拟器
- 启动 AVD Manager :
在 Android Studio 中,点击工具栏的 AVD Manager 图标,或通过 Tools > AVD Manager 访问。
- 创建新的虚拟设备 :
点击 Create Virtual Device ,选择设备型号(如 Pixel 4),点击 Next 。
- 选择系统映像 :
选择一个 Android 系统映像(建议使用最新稳定版),点击 Download (如果尚未下载),然后点击 Next 。
- 完成设置 :
点击 Finish 创建虚拟设备。
- 启动模拟器 :
在 AVD Manager 中,点击刚创建的虚拟设备旁边的 播放 按钮启动模拟器。
3. 创建你的第一个 Flutter 项目
3.1 使用 Android Studio 创建项目
- 启动 Android Studio :
打开 Android Studio,如果是首次启动,可能需要一些时间进行初始化。
- 新建 Flutter 项目 :
点击 Start a new Flutter project 。
- 选择项目类型 :
选择 Flutter Application ,点击 Next 。
- 配置项目 :
填写以下信息:
* **Project name** :输入项目名称(例如 `my_first_flutter_app`)。
* **Flutter SDK path** :确认 Flutter SDK 路径(应自动填充)。
* **Project location** :选择项目存储位置。
* **Description** :可选,输入项目描述。
-
选择平台语言 :
- Android language :选择
Kotlin或Java。 - iOS language :选择
Swift或Objective-C。
- Android language :选择
通常选择默认的 Kotlin 和 Swift。
- 完成创建 :
点击 Finish ,Android Studio 将自动创建并打开项目。
3.2 运行项目
- 选择设备 :
在 Android Studio 中,确保你已启动模拟器或连接了真实设备。点击工具栏上的设备选择器,选择目标设备。
- 运行应用 :
点击工具栏上的绿色运行按钮(▶️),应用将被编译并部署到选定的设备上。
- 查看效果 :
应用启动后,你将看到一个简单的计数器应用,点击按钮可以增加计数。
4. 项目结构解析
Flutter 项目包含多个文件和文件夹,以下是主要部分的介绍:
my_first_flutter_app/
├── android/
├── build/
├── ios/
├── lib/
│ └── main.dart
├── test/
├── pubspec.yaml
└── README.md
4.1 关键目录与文件
- android/ :包含 Android 平台相关的配置文件和源代码。
- ios/ :包含 iOS 平台相关的配置文件和源代码。
- lib/ :存放 Dart 代码,是应用的主要代码库。
- main.dart :应用的入口文件,定义了应用的启动逻辑和根 Widget。
- test/ :存放测试代码。
- pubspec.yaml :项目配置文件,定义了应用的依赖、资源等。
- README.md :项目说明文件。
5. 基础 Widgets
Widgets 是 Flutter 的核心构建块,几乎所有东西都是 Widget。理解 Widgets 的使用是开发 Flutter 应用的基础。
5.1 Stateless Widget vs Stateful Widget
Stateless Widget
- 定义 :不可变的 Widget,一旦构建后不会改变其状态。
- 适用场景 :显示静态内容,如图标、文本等。
示例:
import 'package:flutter/material.dart';
class MyStatelessWidget extends StatelessWidget {
final String title;
MyStatelessWidget({required this.title});
Widget build(BuildContext context) {
return Text(title);
}
}
Stateful Widget
- 定义 :可变的 Widget,具有内部状态,可以在生命周期中改变。
- 适用场景 :需要动态更新内容的 Widget,如表单、动画等。
示例:
import 'package:flutter/material.dart';
class MyStatefulWidget extends StatefulWidget {
final String title;
MyStatefulWidget({required this.title});
_MyStatefulWidgetState createState() => _MyStatefulWidgetState();
}
class _MyStatefulWidgetState extends State<MyStatefulWidget> {
int counter = 0;
void _incrementCounter() {
setState(() {
counter++;
});
}
Widget build(BuildContext context) {
return Column(
children: [
Text(widget.title),
Text('Counter: $counter'),
ElevatedButton(
onPressed: _incrementCounter,
child: Text('Increment'),
),
],
);
}
}
6. 布局与设计
布局是 Flutter 应用设计的关键部分,掌握布局 Widgets 可以帮助你创建灵活且美观的界面。
6.1 常用布局 Widgets
- Container :基本的布局 Widget,可以设置边距、填充、背景颜色等。
- Row 和 Column :水平和垂直布局容器,用于排列子 Widgets。
- Stack :叠加布局,允许子 Widgets 层叠显示。
- Expanded 和 Flexible :用于在 Row 和 Column 中调整子 Widgets 的占用空间。
- Padding 和 Margin :设置内边距和外边距。
示例:使用 Row 和 Column 创建布局
import 'package:flutter/material.dart';
class MyLayoutWidget extends StatelessWidget {
Widget build(BuildContext context) {
return Column(
children: [
Row(
children: [
Text('Hello'),
SizedBox(width: 10),
Text('World'),
],
),
Container(
padding: EdgeInsets.all(16),
color: Colors.blue,
child: Text('This is a container'),
),
],
);
}
}
6.2 响应式设计
Flutter 支持响应式设计,通过使用布局 Widgets 和 MediaQuery 可以适应不同屏幕尺寸和方向。
示例:根据屏幕宽度调整布局
import 'package:flutter/material.dart';
class ResponsiveLayout extends StatelessWidget {
Widget build(BuildContext context) {
// 获取屏幕宽度
double screenWidth = MediaQuery.of(context).size.width;
return Scaffold(
appBar: AppBar(title: Text('Responsive Layout')),
body: screenWidth > 600
? Row(
children: [
Expanded(child: Text('Sidebar')),
Expanded(child: Text('Content')),
],
)
: Column(
children: [
Text('Content'),
Text('Sidebar'),
],
),
);
}
}
7. 用户输入处理
用户输入是应用互动的重要部分,Flutter 提供了多种控件来处理用户输入。
7.1 表单与输入控件
- TextField :用于单行文本输入。
- TextFormField :集成了表单验证功能的文本输入。
- Checkbox 、Radio 、Switch :用于选择性输入。
- DropdownButton :下拉选择菜单。
示例:简单表单
import 'package:flutter/material.dart';
class MyForm extends StatefulWidget {
_MyFormState createState() => _MyFormState();
}
class _MyFormState extends State<MyForm> {
final _formKey = GlobalKey<FormState>();
String _name = '';
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('My Form')),
body: Padding(
padding: EdgeInsets.all(16),
child: Form(
key: _formKey,
child: Column(
children: [
TextFormField(
decoration: InputDecoration(labelText: 'Name'),
onSaved: (value) {
_name = value ?? '';
},
validator: (value) {
if (value == null || value.isEmpty) {
return 'Please enter your name';
}
return null;
},
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () {
if (_formKey.currentState!.validate()) {
_formKey.currentState!.save();
// 处理数据
print('Name: $_name');
}
},
child: Text('Submit'),
),
],
),
),
),
);
}
}
8. 导航与路由
导航是 Flutter 应用中管理页面切换的机制。Flutter 提供了多种方式来实现页面导航。
8.1 使用 Navigator 进行导航
示例:基本导航
import 'package:flutter/material.dart';
class FirstPage extends StatelessWidget {
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('First Page'),
),
body: Center(
child: ElevatedButton(
child: Text('Go to Second Page'),
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondPage()),
);
},
),
),
);
}
}
class SecondPage extends StatelessWidget {
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Second Page'),
),
body: Center(
child: ElevatedButton(
child: Text('Go Back'),
onPressed: () {
Navigator.pop(context);
},
),
),
);
}
}
8.2 命名路由
示例:使用命名路由
- 定义路由 :
void main() {
runApp(MaterialApp(
initialRoute: '/',
routes: {
'/': (context) => FirstPage(),
'/second': (context) => SecondPage(),
},
));
}
- 导航到命名路由 :
ElevatedButton(
child: Text('Go to Second Page'),
onPressed: () {
Navigator.pushNamed(context, '/second');
},
);
9. 状态管理
状态管理是 Flutter 开发中一个重要的主题,特别是在构建复杂应用时。Flutter 提供了多种状态管理解决方案,下面介绍最常用的两种:setState 和 Provider。
9.1 setState
setState 是 Flutter 中最基本的状态管理方法,适用于管理局部状态。
示例:使用 setState 管理状态
import 'package:flutter/material.dart';
class CounterPage extends StatefulWidget {
_CounterPageState createState() => _CounterPageState();
}
class _CounterPageState extends State<CounterPage> {
int _counter = 0;
void _incrementCounter() {
setState(() { // 通知 Flutter 更新 UI
_counter++;
});
}
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Counter')),
body: Center(child: Text('Counter: $_counter')),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
child: Icon(Icons.add),
));
}
}
9.2 Provider
Provider 是一个更为强大且灵活的状态管理解决方案,适用于跨多个 Widget 管理共享状态。
步骤:
- 添加依赖 :
在 pubspec.yaml 中添加 provider 依赖:
dependencies:
flutter:
sdk: flutter
provider: ^6.0.0
然后运行 flutter pub get 安装依赖。
- 创建状态类 :
import 'package:flutter/foundation.dart';
class Counter with ChangeNotifier {
int _count = 0;
int get count => _count;
void increment() {
_count++;
notifyListeners(); // 通知监听器更新
}
}
- 提供状态 :
在应用的根 Widget 中提供状态:
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'counter.dart'; // 导入 Counter 类
void main() {
runApp(
ChangeNotifierProvider(
create: (context) => Counter(),
child: MyApp(),
),
);
}
class MyApp extends StatelessWidget {
Widget build(BuildContext context) {
return MaterialApp(
home: CounterPage(),
);
}
}
- 消费状态 :
在需要的地方使用 Consumer 或 Provider.of 来访问和修改状态。
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'counter.dart'; // 导入 Counter 类
class CounterPage extends StatelessWidget {
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Provider Counter')),
body: Center(
child: Consumer<Counter>(
builder: (context, counter, child) {
return Text('Counter: ${counter.count}');
},
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
Provider.of<Counter>(context, listen: false).increment();
},
child: Icon(Icons.add),
),
);
}
}
10. 网络请求与数据处理
在现代应用中,网络请求和数据处理是必不可少的。Flutter 提供了强大的网络功能,可以轻松实现这些需求。
10.1 HTTP 请求
使用 http 包可以轻松发送 HTTP 请求。
步骤:
- 添加依赖 :
在 pubspec.yaml 中添加 http 依赖:
dependencies:
flutter:
sdk: flutter
http: ^0.13.4
然后运行 flutter pub get 安装依赖。
- 发送请求 :
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
class FetchDataPage extends StatefulWidget {
_FetchDataPageState createState() => _FetchDataPageState();
}
class _FetchDataPageState extends State<FetchDataPage> {
String data = 'Fetching data...';
void initState() {
super.initState();
fetchData();
}
Future<void> fetchData() async {
final response = await http.get(Uri.parse('https://jsonplaceholder.typicode
更多推荐

所有评论(0)