第 12 章 实用插件速查与入门
以下均为 pub.dev 官方或社区验证的高口碑包(版本号以 pub.dev 最新稳定版为准)。每个给出最小可运行示例。
| 插件 | 用途 | 备注 |
|---|---|---|
riverpod | 状态管理 | 本手册主推,见第 7.5 章 |
go_router | 声明式路由 | 见第 6.3 章 |
dio | 网络请求 | 拦截器/取消/下载,见下文 |
shared_preferences / sqflite | 持久化 | 见第 9 章 |
cached_network_image | 网络图片+磁盘缓存 | 见下文 |
intl | 格式化与多语言 | 见第 11 章 |
flutter_dotenv | 环境变量(.env) | 区分测试/生产 API 地址 |
permission_handler | 运行时权限申请 | 相机/定位/存储 |
image_picker | 拍照/选图 | 官方维护 |
webview_flutter | 内嵌网页 | 官方维护 |
12.1 dio:拦截器与统一错误处理
dependencies:
dio: ^5.7.0
final dio = Dio(BaseOptions(
baseUrl: 'https://api.example.com',
connectTimeout: const Duration(seconds: 10),
receiveTimeout: const Duration(seconds: 15),
));
// 拦截器:统一加 token、打日志
dio.interceptors.add(InterceptorsWrapper(
onRequest: (options, handler) {
options.headers['Authorization'] = 'Bearer <token>';
handler.next(options);
},
onError: (e, handler) {
if (e.response?.statusCode == 401) {/* 跳转登录页 */}
handler.next(e);
},
));
// 用法与 http 类似但返回已解析的对象
final resp = await dio.get('/user/1');
final user = resp.data; // Map
12.2 cached_network_image:带缓存的图片
CachedNetworkImage(
imageUrl: 'https://picsum.photos/300/200',
placeholder: (_, __) => const Center(child: CircularProgressIndicator()),
errorWidget: (_, __, ___) => const Icon(Icons.broken_image),
fit: BoxFit.cover,
)
12.3 image_picker + permission_handler:拍照上传
final picker = ImagePicker();
final XFile? photo = await picker.pickImage(source: ImageSource.camera, imageQuality: 80);
if (photo != null) {
final file = File(photo.path); // 之后可 multipart 上传
}
// 动态权限(相机等敏感权限要先申请)
final status = await Permission.camera.request();
if (status.isGranted) {/* 已授权 */}