0%

Flutter 开发速览

以下是 Flutter 开发的 基本语法高级特性 整理,涵盖了从入门到进阶的内容,包括核心概念、基础开发语法和高阶功能特性。


一、Flutter 基本概念

1.1 入口函数

Flutter 应用的入口是 main(),通过 runApp() 加载根 Widget。

1
2
3
void main() {
runApp(MyApp());
}

1.2 基本的 Widget

  • StatelessWidget: 静态的不可变组件。
  • StatefulWidget: 动态可变的组件。

StatelessWidget 示例

1
2
3
4
5
6
7
8
9
10
11
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('StatelessWidget Example')),
body: Center(child: Text('Hello, Flutter!')),
),
);
}
}

StatefulWidget 示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Counter extends StatefulWidget {
@override
_CounterState createState() => _CounterState();
}

class _CounterState extends State<Counter> {
int _count = 0;

void _increment() {
setState(() {
_count++;
});
}

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('StatefulWidget Example')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('Count: $_count'),
ElevatedButton(onPressed: _increment, child: Text('Increment'))
],
),
),
);
}
}

1.3 布局

常用布局组件

组件 描述
Container 通用容器,支持样式和尺寸控制
Row 水平排列子组件
Column 垂直排列子组件
Stack 层叠子组件
ListView 滚动列表

布局示例

1
2
3
4
5
6
7
8
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('Item 1'),
Text('Item 2'),
Text('Item 3'),
],
);

1.4 样式与装饰

  • 使用 TextStyle 设置字体样式。
  • 使用 BoxDecoration 设置容器样式。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
Text(
'Styled Text',
style: TextStyle(fontSize: 24, color: Colors.blue, fontWeight: FontWeight.bold),
);

Container(
padding: EdgeInsets.all(16),
decoration: BoxDecoration(
color: Colors.blue,
borderRadius: BorderRadius.circular(8),
),
child: Text('Decorated Container'),
);

1.5 用户交互

通过 GestureDetectorInkWell 捕获用户的触摸事件。

GestureDetector 示例

1
2
3
4
5
6
7
8
9
10
GestureDetector(
onTap: () {
print('Container tapped!');
},
child: Container(
color: Colors.green,
padding: EdgeInsets.all(16),
child: Text('Tap Me!'),
),
);

1.6 路由与导航

页面跳转

1
2
3
4
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondPage()),
);

返回上一页

1
Navigator.pop(context);

二、Flutter 高级特性

2.1 状态管理

Flutter 提供多种状态管理解决方案,用于管理应用状态。

Provider 示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Counter with ChangeNotifier {
int _count = 0;
int get count => _count;

void increment() {
_count++;
notifyListeners();
}
}

void main() {
runApp(
ChangeNotifierProvider(
create: (_) => Counter(),
child: MyApp(),
),
);
}

2.2 异步与流

异步操作

使用 asyncawait 处理异步任务:

1
2
3
4
Future<String> fetchData() async {
await Future.delayed(Duration(seconds: 2));
return 'Data Loaded';
}

Stream 示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Stream<int> counterStream() async* {
for (int i = 0; i < 10; i++) {
await Future.delayed(Duration(seconds: 1));
yield i;
}
}

StreamBuilder<int>(
stream: counterStream(),
builder: (context, snapshot) {
if (snapshot.hasData) {
return Text('Count: ${snapshot.data}');
}
return CircularProgressIndicator();
},
);

2.3 动画

Flutter 提供强大的动画支持,通过 AnimationController 实现复杂动画效果。

动画示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class MyAnimatedWidget extends StatefulWidget {
@override
_MyAnimatedWidgetState createState() => _MyAnimatedWidgetState();
}

class _MyAnimatedWidgetState extends State<MyAnimatedWidget>
with SingleTickerProviderStateMixin {
late AnimationController _controller;

@override
void initState() {
super.initState();
_controller = AnimationController(
duration: const Duration(seconds: 2),
vsync: this,
)..repeat();
}

@override
Widget build(BuildContext context) {
return AnimatedBuilder(
animation: _controller,
builder: (context, child) {
return Transform.rotate(
angle: _controller.value * 2.0 * 3.14159,
child: child,
);
},
child: Icon(Icons.star, size: 100),
);
}

@override
void dispose() {
_controller.dispose();
super.dispose();
}
}

2.4 自定义绘制

使用 CustomPainter 实现自定义图形绘制。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class MyPainter extends CustomPainter {
@override
void paint(Canvas canvas, Size size) {
final paint = Paint()
..color = Colors.blue
..strokeWidth = 4;

canvas.drawCircle(Offset(size.width / 2, size.height / 2), 50, paint);
}

@override
bool shouldRepaint(covariant CustomPainter oldDelegate) => false;
}

@override
Widget build(BuildContext context) {
return CustomPaint(
size: Size(200, 200),
painter: MyPainter(),
);
}

2.5 平台集成

Platform Channel 示例

Dart 端:

1
2
3
4
5
6
7
8
9
10
const platform = MethodChannel('com.example/native');

Future<void> callNativeMethod() async {
try {
final result = await platform.invokeMethod('getBatteryLevel');
print('Battery level: $result');
} catch (e) {
print('Error: $e');
}
}

Android 端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class MainActivity : FlutterActivity() {
private val CHANNEL = "com.example/native"

override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL)
.setMethodCallHandler { call, result ->
if (call.method == "getBatteryLevel") {
val batteryLevel = getBatteryLevel()
result.success(batteryLevel)
} else {
result.notImplemented()
}
}
}

private fun getBatteryLevel(): Int {
val batteryManager = getSystemService(Context.BATTERY_SERVICE) as BatteryManager
return batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)
}
}

2.6 性能优化

  • 使用 const 构造函数优化不可变组件。
  • 减少 RepaintBoundary 的使用区域。
  • 避免不必要的状态重建,使用 ProviderValueNotifier

2.7 国际化

通过 flutter_localizations 支持多语言。

示例

1
2
3
4
5
6
7
8
9
10
MaterialApp(
localizationsDelegates: [
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
],
supportedLocales: [
Locale('en', 'US'),
Locale('zh', 'CN'),
],
);

总结

基础语法

  1. Flutter 应用由 Widget 组成,包括布局、样式和事件处理。
  2. 通过导航管理页面跳转。
  3. 使用内置组件快速搭建界面。

高级特性

  1. 状态管理:ProviderRiverpod 等适合复杂应用。
  2. 动画与自定义绘制:通过 AnimationControllerCustomPainter 实现高级交互。
  3. 异步与流:处理实时数据和异步任务。
  4. 平台集成:通过 Platform Channel 实现与原生代码的交互。
  5. 性能优化与国际化:优化重建,支持多语言。

掌握这些内容,能够应对从简单应用到复杂业务场景的开发需求。