初识Flutter
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)