深入理解Flutter开发技术,掌握跨平台应用开发
Flutter开发详解
本文将深入介绍Flutter开发的核心概念和最佳实践,帮助你掌握跨平台应用开发技术。
无状态组件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class CustomButton extends StatelessWidget {
final String text ;
final VoidCallback onPressed ;
const CustomButton ({
Key ? key ,
required this . text ,
required this . onPressed ,
}) : super ( key: key );
@ override
Widget build ( BuildContext context ) {
return ElevatedButton (
onPressed: onPressed ,
child: Text ( text ),
style: ElevatedButton . styleFrom (
primary: Colors . blue ,
padding: EdgeInsets . symmetric ( horizontal: 20 , vertical: 10 ),
),
);
}
}
有状态组件
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
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 Column (
children: [
Text ( 'Count: $ _count ' ),
CustomButton (
text: 'Increment' ,
onPressed: _increment ,
),
],
);
}
}
状态管理
Provider模式
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
class CounterProvider with ChangeNotifier {
int _count = 0 ;
int get count => _count ;
void increment () {
_count ++ ;
notifyListeners ();
}
}
// 使用Provider
void main () {
runApp (
ChangeNotifierProvider (
create: ( _ ) => CounterProvider (),
child: MyApp (),
),
);
}
// 在Widget中使用
class CounterWidget extends StatelessWidget {
@ override
Widget build ( BuildContext context ) {
return Consumer < CounterProvider > (
builder: ( context , counter , child ) {
return Text ( 'Count: ${ counter . count } ' );
},
);
}
}
Bloc模式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 事件
abstract class CounterEvent {}
class IncrementEvent extends CounterEvent {}
// 状态
class CounterState {
final int count ;
CounterState ( this . count );
}
// Bloc
class CounterBloc extends Bloc < CounterEvent , CounterState > {
CounterBloc () : super ( CounterState ( 0 )) {
on < IncrementEvent > (( event , emit ) {
emit ( CounterState ( state . count + 1 ));
});
}
}
网络请求
HTTP请求
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class ApiService {
final client = http . Client ();
Future < List < User >> getUsers () async {
try {
final response = await client . get (
Uri . parse ( 'https://api.example.com/users' ),
);
if ( response . statusCode == 200 ) {
final List < dynamic > data = json . decode ( response . body );
return data . map (( json ) => User . fromJson ( json )). toList ();
} else {
throw Exception ( 'Failed to load users' );
}
} catch ( e ) {
throw Exception ( 'Network error: $ e ' );
}
}
}
WebSocket连接
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
class WebSocketService {
late WebSocketChannel channel ;
void connect () {
channel = WebSocketChannel . connect (
Uri . parse ( 'ws://example.com/ws' ),
);
channel . stream . listen (
( message ) {
print ( 'Received: $ message ' );
},
onError: ( error ) {
print ( 'Error: $ error ' );
},
onDone: () {
print ( 'Connection closed' );
},
);
}
void sendMessage ( String message ) {
channel . sink . add ( message );
}
void dispose () {
channel . sink . close ();
}
}
本地存储
SharedPreferences
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class StorageService {
late SharedPreferences _prefs ;
Future < void > init () async {
_prefs = await SharedPreferences . getInstance ();
}
Future < void > saveToken ( String token ) async {
await _prefs . setString ( 'token' , token );
}
String ? getToken () {
return _prefs . getString ( 'token' );
}
Future < void > clearToken () async {
await _prefs . remove ( 'token' );
}
}
SQLite数据库
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
class DatabaseHelper {
static final _databaseName = "my_db.db" ;
static final _databaseVersion = 1 ;
static Database ? _database ;
Future < Database > get database async {
if ( _database != null ) return _database ! ;
_database = await _initDatabase ();
return _database ! ;
}
Future < Database > _initDatabase () async {
String path = join ( await getDatabasesPath (), _databaseName );
return await openDatabase (
path ,
version: _databaseVersion ,
onCreate: _onCreate ,
);
}
Future _onCreate ( Database db , int version ) async {
await db . execute ( '''
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
email TEXT NOT NULL
)
''' );
}
}
动画实现
基础动画
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
39
40
41
42
43
class AnimatedLogo extends StatefulWidget {
@ override
_AnimatedLogoState createState () => _AnimatedLogoState ();
}
class _AnimatedLogoState extends State < AnimatedLogo >
with SingleTickerProviderStateMixin {
late AnimationController controller ;
late Animation < double > animation ;
@ override
void initState () {
super . initState ();
controller = AnimationController (
duration: const Duration ( seconds: 2 ),
vsync: this ,
);
animation = CurvedAnimation (
parent: controller ,
curve: Curves . easeInOut ,
);
controller . repeat ( reverse: true );
}
@ override
Widget build ( BuildContext context ) {
return AnimatedBuilder (
animation: animation ,
builder: ( context , child ) {
return Transform . scale (
scale: animation . value ,
child: FlutterLogo ( size: 100 ),
);
},
);
}
@ override
void dispose () {
controller . dispose ();
super . dispose ();
}
}
Hero动画
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
// 列表页面
class ListPage extends StatelessWidget {
@ override
Widget build ( BuildContext context ) {
return ListView . builder (
itemBuilder: ( context , index ) {
return Hero (
tag: 'image- $ index ' ,
child: Image . network ( 'https://example.com/image- $ index .jpg' ),
);
},
);
}
}
// 详情页面
class DetailPage extends StatelessWidget {
final int index ;
DetailPage ( this . index );
@ override
Widget build ( BuildContext context ) {
return Scaffold (
body: Center (
child: Hero (
tag: 'image- $ index ' ,
child: Image . network ( 'https://example.com/image- $ index .jpg' ),
),
),
);
}
}
最佳实践
性能优化
使用const构造函数
避免不必要的重建
合理使用缓存
优化图片加载
开发建议
遵循Material设计
实现响应式布局
处理平台差异
编写单元测试
掌握这些Flutter开发技巧,将帮助你构建高质量的跨平台应用。
Licensed under CC BY-NC-SA 4.0