面试题答案
一键面试- 引入依赖:
在
pubspec.yaml
文件中添加provider
依赖:
然后运行dependencies: provider: ^[latest_version]
flutter pub get
下载依赖。 - 创建数据模型:
例如,如果从网络获取用户信息,创建用户数据模型:
class User { final String name; final int age; User({required this.name, required this.age}); }
- 创建状态管理类:
使用
ChangeNotifier
来处理状态变化。import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; import 'dart:convert'; class UserProvider extends ChangeNotifier { User? _user; bool _isLoading = false; User? get user => _user; bool get isLoading => _isLoading; Future<void> fetchUser() async { _isLoading = true; notifyListeners(); try { final response = await http.get(Uri.parse('your_api_url')); if (response.statusCode == 200) { final data = json.decode(response.body); _user = User(name: data['name'], age: data['age']); } else { throw Exception('Failed to load user'); } } catch (e) { print('Error: $e'); } finally { _isLoading = false; notifyListeners(); } } }
- 在Widget树中提供状态:
在
main.dart
或合适的上层Widget中使用ChangeNotifierProvider
。void main() { runApp( ChangeNotifierProvider( create: (context) => UserProvider(), child: MyApp(), ), ); }
- 消费状态并触发异步操作:
在需要显示用户信息的Widget中,通过
Provider.of
获取状态,并在合适的时机触发fetchUser
方法。class UserPage extends StatelessWidget { @override Widget build(BuildContext context) { final userProvider = Provider.of<UserProvider>(context); return Scaffold( appBar: AppBar(title: Text('User Page')), body: Column( children: [ if (userProvider.isLoading) CircularProgressIndicator(), if (userProvider.user!= null) Column( children: [ Text('Name: ${userProvider.user!.name}'), Text('Age: ${userProvider.user!.age}'), ], ), ElevatedButton( onPressed: () { userProvider.fetchUser(); }, child: Text('Fetch User'), ), ], ), ); } }
步骤总结:
- 引入
provider
依赖。 - 创建数据模型。
- 创建继承自
ChangeNotifier
的状态管理类,在其中处理异步操作并更新状态。 - 在Widget树的上层提供状态。
- 在需要的Widget中消费状态并触发异步操作,根据状态变化更新UI。