摘要
本文深入分析Flutter技术栈的核心组件、状态管理机制、架构模式以及性能优化策略。从基础概念到高级应用,提供完整的技术解决方案。结合企业级项目经验,给出可落地的技术实现方案。
1. Flutter技术栈核心组件分析
1.1 Flutter框架架构
1.1.1 框架层次结构
Flutter Framework Material Design Cupertino Design Widgets Rendering Animation Painting Gestures Flutter Engine Skia Graphics Dart Runtime Platform Channels
1.1.2 Widget树结构
dart
// Flutter Widget树示例
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: MyHomePage(),
routes: {
'/second': (context) => SecondPage(),
'/third': (context) => ThirdPage(),
},
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
void _incrementCounter() {
setState(() {
_counter++;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter Demo'),
actions: [
IconButton(
icon: Icon(Icons.settings),
onPressed: () {
Navigator.pushNamed(context, '/second');
},
),
],
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'You have pushed the button this many times:',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.headline4,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
}
1.2 Dart语言特性
1.2.1 异步编程
dart
// Future和async/await
class ApiService {
static const String baseUrl = 'https://api.example.com';
// 异步方法
static Future<Map<String, dynamic>> fetchData(String endpoint) async {
try {
final response = await http.get(
Uri.parse('$baseUrl$endpoint'),
headers: {'Content-Type': 'application/json'},
);
if (response.statusCode == 200) {
return json.decode(response.body);
} else {
throw Exception('Failed to load data: ${response.statusCode}');
}
} catch (e) {
throw Exception('Network error: $e');
}
}
// Stream处理
static Stream<List<Map<String, dynamic>>> fetchDataStream() async* {
for (int i = 0; i < 10; i++) {
await Future.delayed(Duration(seconds: 1));
yield await fetchData('/data/$i');
}
}
}
// 使用示例
class DataScreen extends StatefulWidget {
@override
_DataScreenState createState() => _DataScreenState();
}
class _DataScreenState extends State<DataScreen> {
List<Map<String, dynamic>> _data = [];
bool _isLoading = false;
String _error = '';
@override
void initState() {
super.initState();
_loadData();
}
Future<void> _loadData() async {
setState(() {
_isLoading = true;
_error = '';
});
try {
final data = await ApiService.fetchData('/users');
setState(() {
_data = List<Map<String, dynamic>>.from(data['users']);
_isLoading = false;
});
} catch (e) {
setState(() {
_error = e.toString();
_isLoading = false;
});
}
}
@override
Widget build(BuildContext context) {
if (_isLoading) {
return Center(child: CircularProgressIndicator());
}
if (_error.isNotEmpty) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('Error: $_error'),
ElevatedButton(
onPressed: _loadData,
child: Text('Retry'),
),
],
),
);
}
return ListView.builder(
itemCount: _data.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(_data[index]['name'] ?? 'Unknown'),
subtitle: Text(_data[index]['email'] ?? 'No email'),
);
},
);
}
}
1.2.2 泛型和类型安全
dart
// 泛型类定义
class Repository<T> {
final List<T> _items = [];
void add(T item) {
_items.add(item);
}
T? get(int index) {
if (index >= 0 && index < _items.length) {
return _items[index];
}
return null;
}
List<T> getAll() => List.from(_items);
void remove(T item) {
_items.remove(item);
}
}
// 使用泛型
class UserRepository extends Repository<User> {
Future<void> loadUsers() async {
final users = await ApiService.fetchData('/users');
for (var userData in users['users']) {
add(User.fromJson(userData));
}
}
}
// 类型安全的数据模型
class User {
final String id;
final String name;
final String email;
final DateTime createdAt;
User({
required this.id,
required this.name,
required this.email,
required this.createdAt,
});
factory User.fromJson(Map<String, dynamic> json) {
return User(
id: json['id'] as String,
name: json['name'] as String,
email: json['email'] as String,
createdAt: DateTime.parse(json['created_at'] as String),
);
}
Map<String, dynamic> toJson() {
return {
'id': id,
'name': name,
'email': email,
'created_at': createdAt.toIso8601String(),
};
}
}
2. 状态管理机制深度分析
2.1 基础状态管理
2.1.1 setState机制
dart
class CounterWidget extends StatefulWidget {
@override
_CounterWidgetState createState() => _CounterWidgetState();
}
class _CounterWidgetState extends State<CounterWidget> {
int _count = 0;
bool _isLoading = false;
void _increment() {
setState(() {
_count++;
});
}
void _decrement() {
setState(() {
_count--;
});
}
Future<void> _asyncIncrement() async {
setState(() {
_isLoading = true;
});
// 模拟异步操作
await Future.delayed(Duration(seconds: 1));
setState(() {
_count++;
_isLoading = false;
});
}
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'Count: $_count',
style: Theme.of(context).textTheme.headline4,
),
SizedBox(height: 20),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
ElevatedButton(
onPressed: _decrement,
child: Text('-'),
),
ElevatedButton(
onPressed: _increment,
child: Text('+'),
),
ElevatedButton(
onPressed: _isLoading ? null : _asyncIncrement,
child: _isLoading
? SizedBox(
width: 20,
height: 20,
child: CircularProgressIndicator(strokeWidth: 2),
)
: Text('Async +'),
),
],
),
],
);
}
}
2.1.2 InheritedWidget状态共享
dart
// 自定义InheritedWidget
class AppState extends InheritedWidget {
final int counter;
final VoidCallback increment;
final VoidCallback decrement;
const AppState({
Key? key,
required this.counter,
required this.increment,
required this.decrement,
required Widget child,
}) : super(key: key, child: child);
static AppState? of(BuildContext context) {
return context.dependOnInheritedWidgetOfExactType<AppState>();
}
@override
bool updateShouldNotify(AppState oldWidget) {
return counter != oldWidget.counter;
}
}
// 使用InheritedWidget
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
int _counter = 0;
void _increment() {
setState(() {
_counter++;
});
}
void _decrement() {
setState(() {
_counter--;
});
}
@override
Widget build(BuildContext context) {
return AppState(
counter: _counter,
increment: _increment,
decrement: _decrement,
child: MaterialApp(
title: 'Flutter Demo',
home: HomeScreen(),
),
);
}
}
class HomeScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
final appState = AppState.of(context);
return Scaffold(
appBar: AppBar(title: Text('Flutter Demo')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('Counter: ${appState?.counter ?? 0}'),
SizedBox(height: 20),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
ElevatedButton(
onPressed: appState?.decrement,
child: Text('-'),
),
ElevatedButton(
onPressed: appState?.increment,
child: Text('+'),
),
],
),
],
),
),
);
}
}
2.2 Provider状态管理
2.2.1 Provider基础使用
dart
// 状态模型
class CounterModel extends ChangeNotifier {
int _count = 0;
bool _isLoading = false;
int get count => _count;
bool get isLoading => _isLoading;
void increment() {
_count++;
notifyListeners();
}
void decrement() {
_count--;
notifyListeners();
}
Future<void> asyncIncrement() async {
_isLoading = true;
notifyListeners();
await Future.delayed(Duration(seconds: 1));
_count++;
_isLoading = false;
notifyListeners();
}
void reset() {
_count = 0;
notifyListeners();
}
}
// 使用Provider
class CounterScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
create: (context) => CounterModel(),
child: Consumer<CounterModel>(
builder: (context, counter, child) {
return Scaffold(
appBar: AppBar(title: Text('Counter Demo')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'Count: ${counter.count}',
style: Theme.of(context).textTheme.headline4,
),
SizedBox(height: 20),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
ElevatedButton(
onPressed: counter.decrement,
child: Text('-'),
),
ElevatedButton(
onPressed: counter.increment,
child: Text('+'),
),
ElevatedButton(
onPressed: counter.isLoading ? null : counter.asyncIncrement,
child: counter.isLoading
? SizedBox(
width: 20,
height: 20,
child: CircularProgressIndicator(strokeWidth: 2),
)
: Text('Async +'),
),
],
),
SizedBox(height: 20),
ElevatedButton(
onPressed: counter.reset,
child: Text('Reset'),
),
],
),
),
);
},
),
);
}
}
2.2.2 MultiProvider复杂状态管理
dart
// 用户状态模型
class UserModel extends ChangeNotifier {
User? _user;
bool _isLoading = false;
String _error = '';
User? get user => _user;
bool get isLoading => _isLoading;
String get error => _error;
bool get isLoggedIn => _user != null;
Future<void> login(String email, String password) async {
_isLoading = true;
_error = '';
notifyListeners();
try {
// 模拟API调用
await Future.delayed(Duration(seconds: 2));
if (email == 'admin@example.com' && password == 'password') {
_user = User(
id: '1',
name: 'Admin User',
email: email,
createdAt: DateTime.now(),
);
} else {
_error = 'Invalid credentials';
}
} catch (e) {
_error = 'Login failed: $e';
} finally {
_isLoading = false;
notifyListeners();
}
}
void logout() {
_user = null;
_error = '';
notifyListeners();
}
}
// 主题状态模型
class ThemeModel extends ChangeNotifier {
bool _isDarkMode = false;
bool get isDarkMode => _isDarkMode;
ThemeMode get themeMode => _isDarkMode ? ThemeMode.dark : ThemeMode.light;
void toggleTheme() {
_isDarkMode = !_isDarkMode;
notifyListeners();
}
}
// 使用MultiProvider
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
ChangeNotifierProvider(create: (context) => UserModel()),
ChangeNotifierProvider(create: (context) => ThemeModel()),
],
child: Consumer<ThemeModel>(
builder: (context, themeModel, child) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData.light(),
darkTheme: ThemeData.dark(),
themeMode: themeModel.themeMode,
home: HomeScreen(),
);
},
),
);
}
}
2.3 Riverpod现代化状态管理
2.3.1 Riverpod基础使用
dart
// 状态提供者
final counterProvider = StateNotifierProvider<CounterNotifier, int>((ref) {
return CounterNotifier();
});
class CounterNotifier extends StateNotifier<int> {
CounterNotifier() : super(0);
void increment() {
state++;
}
void decrement() {
state--;
}
void reset() {
state = 0;
}
}
// 异步状态提供者
final userProvider = FutureProvider<User>((ref) async {
final response = await http.get(Uri.parse('https://api.example.com/user'));
if (response.statusCode == 200) {
return User.fromJson(json.decode(response.body));
} else {
throw Exception('Failed to load user');
}
});
// 使用Riverpod
class CounterScreen extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final count = ref.watch(counterProvider);
final userAsync = ref.watch(userProvider);
return Scaffold(
appBar: AppBar(title: Text('Counter Demo')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'Count: $count',
style: Theme.of(context).textTheme.headline4,
),
SizedBox(height: 20),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
ElevatedButton(
onPressed: () => ref.read(counterProvider.notifier).decrement(),
child: Text('-'),
),
ElevatedButton(
onPressed: () => ref.read(counterProvider.notifier).increment(),
child: Text('+'),
),
ElevatedButton(
onPressed: () => ref.read(counterProvider.notifier).reset(),
child: Text('Reset'),
),
],
),
SizedBox(height: 40),
userAsync.when(
data: (user) => Text('User: ${user.name}'),
loading: () => CircularProgressIndicator(),
error: (error, stack) => Text('Error: $error'),
),
],
),
),
);
}
}
2.3.2 Riverpod高级特性
dart
// 依赖注入
final apiServiceProvider = Provider<ApiService>((ref) {
return ApiService();
});
final userRepositoryProvider = Provider<UserRepository>((ref) {
final apiService = ref.read(apiServiceProvider);
return UserRepository(apiService);
});
// 状态持久化
final settingsProvider = StateNotifierProvider<SettingsNotifier, Settings>((ref) {
return SettingsNotifier();
});
class SettingsNotifier extends StateNotifier<Settings> {
SettingsNotifier() : super(Settings());
void updateTheme(bool isDark) {
state = state.copyWith(isDark: isDark);
}
void updateLanguage(String language) {
state = state.copyWith(language: language);
}
}
// 状态监听
class SettingsListener extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
ref.listen<Settings>(settingsProvider, (previous, next) {
if (previous?.isDark != next.isDark) {
// 主题变化处理
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Theme changed')),
);
}
});
return Container();
}
}
2.4 Bloc状态管理
2.4.1 Bloc基础实现
dart
// 事件定义
abstract class CounterEvent {}
class CounterIncrement extends CounterEvent {}
class CounterDecrement extends CounterEvent {}
class CounterReset extends CounterEvent {}
// 状态定义
class CounterState {
final int count;
final bool isLoading;
const CounterState({
required this.count,
this.isLoading = false,
});
CounterState copyWith({
int? count,
bool? isLoading,
}) {
return CounterState(
count: count ?? this.count,
isLoading: isLoading ?? this.isLoading,
);
}
}
// Bloc实现
class CounterBloc extends Bloc<CounterEvent, CounterState> {
CounterBloc() : super(const CounterState(count: 0)) {
on<CounterIncrement>(_onIncrement);
on<CounterDecrement>(_onDecrement);
on<CounterReset>(_onReset);
}
void _onIncrement(CounterIncrement event, Emitter<CounterState> emit) {
emit(state.copyWith(count: state.count + 1));
}
void _onDecrement(CounterDecrement event, Emitter<CounterState> emit) {
emit(state.copyWith(count: state.count - 1));
}
void _onReset(CounterReset event, Emitter<CounterState> emit) {
emit(const CounterState(count: 0));
}
}
// 使用Bloc
class CounterScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BlocProvider(
create: (context) => CounterBloc(),
child: BlocBuilder<CounterBloc, CounterState>(
builder: (context, state) {
return Scaffold(
appBar: AppBar(title: Text('Counter Demo')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'Count: ${state.count}',
style: Theme.of(context).textTheme.headline4,
),
SizedBox(height: 20),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
ElevatedButton(
onPressed: () => context.read<CounterBloc>().add(CounterDecrement()),
child: Text('-'),
),
ElevatedButton(
onPressed: () => context.read<CounterBloc>().add(CounterIncrement()),
child: Text('+'),
),
ElevatedButton(
onPressed: () => context.read<CounterBloc>().add(CounterReset()),
child: Text('Reset'),
),
],
),
],
),
),
);
},
),
);
}
}
3. 架构模式深度分析
3.1 MVVM架构模式
3.1.1 MVVM架构实现
dart
// Model
class User {
final String id;
final String name;
final String email;
final DateTime createdAt;
User({
required this.id,
required this.name,
required this.email,
required this.createdAt,
});
factory User.fromJson(Map<String, dynamic> json) {
return User(
id: json['id'] as String,
name: json['name'] as String,
email: json['email'] as String,
createdAt: DateTime.parse(json['created_at'] as String),
);
}
Map<String, dynamic> toJson() {
return {
'id': id,
'name': name,
'email': email,
'created_at': createdAt.toIso8601String(),
};
}
}
// ViewModel
class UserViewModel extends ChangeNotifier {
final UserRepository _userRepository;
UserViewModel(this._userRepository);
User? _user;
bool _isLoading = false;
String _error = '';
User? get user => _user;
bool get isLoading => _isLoading;
String get error => _error;
bool get hasError => _error.isNotEmpty;
Future<void> loadUser(String userId) async {
_isLoading = true;
_error = '';
notifyListeners();
try {
_user = await _userRepository.getUser(userId);
} catch (e) {
_error = e.toString();
} finally {
_isLoading = false;
notifyListeners();
}
}
Future<void> updateUser(User user) async {
_isLoading = true;
_error = '';
notifyListeners();
try {
_user = await _userRepository.updateUser(user);
} catch (e) {
_error = e.toString();
} finally {
_isLoading = false;
notifyListeners();
}
}
}
// Repository
class UserRepository {
final ApiService _apiService;
UserRepository(this._apiService);
Future<User> getUser(String userId) async {
final response = await _apiService.get('/users/$userId');
return User.fromJson(response);
}
Future<User> updateUser(User user) async {
final response = await _apiService.put('/users/${user.id}', user.toJson());
return User.fromJson(response);
}
}
// View
class UserScreen extends StatelessWidget {
final String userId;
const UserScreen({required this.userId});
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
create: (context) => UserViewModel(
UserRepository(ApiService()),
),
child: Consumer<UserViewModel>(
builder: (context, viewModel, child) {
if (viewModel.isLoading) {
return Center(child: CircularProgressIndicator());
}
if (viewModel.hasError) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('Error: ${viewModel.error}'),
ElevatedButton(
onPressed: () => viewModel.loadUser(userId),
child: Text('Retry'),
),
],
),
);
}
final user = viewModel.user;
if (user == null) {
return Center(child: Text('No user data'));
}
return Scaffold(
appBar: AppBar(title: Text('User Profile')),
body: Padding(
padding: EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('Name: ${user.name}'),
SizedBox(height: 8),
Text('Email: ${user.email}'),
SizedBox(height: 8),
Text('Created: ${user.createdAt}'),
SizedBox(height: 16),
ElevatedButton(
onPressed: () => viewModel.loadUser(userId),
child: Text('Refresh'),
),
],
),
),
);
},
),
);
}
}
3.2 Clean Architecture架构
3.2.1 分层架构实现
dart
// Domain Layer - Entities
class User {
final String id;
final String name;
final String email;
User({
required this.id,
required this.name,
required this.email,
});
}
// Domain Layer - Use Cases
abstract class GetUserUseCase {
Future<User> execute(String userId);
}
class GetUserUseCaseImpl implements GetUserUseCase {
final UserRepository _userRepository;
GetUserUseCaseImpl(this._userRepository);
@override
Future<User> execute(String userId) async {
return await _userRepository.getUser(userId);
}
}
// Data Layer - Repository Interface
abstract class UserRepository {
Future<User> getUser(String userId);
}
// Data Layer - Repository Implementation
class UserRepositoryImpl implements UserRepository {
final UserDataSource _userDataSource;
UserRepositoryImpl(this._userDataSource);
@override
Future<User> getUser(String userId) async {
final userData = await _userDataSource.getUser(userId);
return User(
id: userData['id'],
name: userData['name'],
email: userData['email'],
);
}
}
// Data Layer - Data Source
abstract class UserDataSource {
Future<Map<String, dynamic>> getUser(String userId);
}
class UserDataSourceImpl implements UserDataSource {
final ApiService _apiService;
UserDataSourceImpl(this._apiService);
@override
Future<Map<String, dynamic>> getUser(String userId) async {
return await _apiService.get('/users/$userId');
}
}
// Presentation Layer - Bloc
class UserBloc extends Bloc<UserEvent, UserState> {
final GetUserUseCase _getUserUseCase;
UserBloc(this._getUserUseCase) : super(UserInitial()) {
on<LoadUser>(_onLoadUser);
}
void _onLoadUser(LoadUser event, Emitter<UserState> emit) async {
emit(UserLoading());
try {
final user = await _getUserUseCase.execute(event.userId);
emit(UserLoaded(user));
} catch (e) {
emit(UserError(e.toString()));
}
}
}
// Presentation Layer - Events
abstract class UserEvent {}
class LoadUser extends UserEvent {
final String userId;
LoadUser(this.userId);
}
// Presentation Layer - States
abstract class UserState {}
class UserInitial extends UserState {}
class UserLoading extends UserState {}
class UserLoaded extends UserState {
final User user;
UserLoaded(this.user);
}
class UserError extends UserState {
final String message;
UserError(this.message);
}
4. 性能优化深度分析
4.1 Widget性能优化
4.1.1 重建优化
dart
// 使用const构造函数
class OptimizedWidget extends StatelessWidget {
const OptimizedWidget({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return const Column(
children: [
Text('Static Text'),
Icon(Icons.star),
],
);
}
}
// 使用RepaintBoundary隔离重绘
class RepaintOptimizedWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return RepaintBoundary(
child: Container(
width: 100,
height: 100,
color: Colors.blue,
child: const Text('Isolated Widget'),
),
);
}
}
// 使用AutomaticKeepAliveClientMixin保持状态
class KeepAliveWidget extends StatefulWidget {
@override
_KeepAliveWidgetState createState() => _KeepAliveWidgetState();
}
class _KeepAliveWidgetState extends State<KeepAliveWidget>
with AutomaticKeepAliveClientMixin {
@override
bool get wantKeepAlive => true;
@override
Widget build(BuildContext context) {
super.build(context); // 必须调用
return Container(
child: Text('This widget will be kept alive'),
);
}
}
4.1.2 列表性能优化
dart
// 使用ListView.builder
class OptimizedList extends StatelessWidget {
final List<String> items;
const OptimizedList({required this.items});
@override
Widget build(BuildContext context) {
return ListView.builder(
itemCount: items.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(items[index]),
);
},
);
}
}
// 使用SliverList
class SliverOptimizedList extends StatelessWidget {
@override
Widget build(BuildContext context) {
return CustomScrollView(
slivers: [
SliverList(
delegate: SliverChildBuilderDelegate(
(context, index) => ListTile(
title: Text('Item $index'),
),
childCount: 1000,
),
),
],
);
}
}
// 使用ListView.separated
class SeparatedList extends StatelessWidget {
final List<String> items;
const SeparatedList({required this.items});
@override
Widget build(BuildContext context) {
return ListView.separated(
itemCount: items.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(items[index]),
);
},
separatorBuilder: (context, index) {
return Divider();
},
);
}
}
4.2 内存管理优化
4.2.1 图片优化
dart
// 使用CachedNetworkImage
class OptimizedImage extends StatelessWidget {
final String imageUrl;
const OptimizedImage({required this.imageUrl});
@override
Widget build(BuildContext context) {
return CachedNetworkImage(
imageUrl: imageUrl,
placeholder: (context, url) => const CircularProgressIndicator(),
errorWidget: (context, url, error) => const Icon(Icons.error),
memCacheWidth: 300, // 限制内存中的图片宽度
memCacheHeight: 300, // 限制内存中的图片高度
);
}
}
// 使用Image.asset优化本地图片
class LocalImage extends StatelessWidget {
final String assetPath;
const LocalImage({required this.assetPath});
@override
Widget build(BuildContext context) {
return Image.asset(
assetPath,
width: 200,
height: 200,
fit: BoxFit.cover,
cacheWidth: 200, // 缓存宽度
cacheHeight: 200, // 缓存高度
);
}
}
4.2.2 内存泄漏防护
dart
// 正确使用StreamSubscription
class StreamWidget extends StatefulWidget {
@override
_StreamWidgetState createState() => _StreamWidgetState();
}
class _StreamWidgetState extends State<StreamWidget> {
StreamSubscription? _subscription;
@override
void initState() {
super.initState();
_subscription = Stream.periodic(Duration(seconds: 1)).listen((data) {
// 处理数据
});
}
@override
void dispose() {
_subscription?.cancel(); // 取消订阅
super.dispose();
}
@override
Widget build(BuildContext context) {
return Container();
}
}
// 使用WeakReference避免循环引用
class WeakReferenceExample {
WeakReference<MyClass>? _weakRef;
void setReference(MyClass obj) {
_weakRef = WeakReference(obj);
}
MyClass? getReference() {
return _weakRef?.target;
}
}
5. 总结
Flutter技术栈是一个强大的跨平台开发解决方案,通过合理的状态管理、架构设计和性能优化,可以构建出高质量、高性能的移动应用。
如果这篇文章对你有帮助,请点赞👍、收藏⭐、关注👆,你的支持是我创作的动力!