当前位置: 首页 > news >正文

Flutter封装模板及最佳实践

以下是一个完整且全面的Flutter封装模板,包含统一标题栏、状态管理、网络请求、路由管理等核心模块,采用分层架构设计:


项目结构

lib/
├── core/
│   ├── base/
│   │   ├── base_controller.dart   // 状态管理基类
│   │   ├── base_view.dart         // 页面基类
│   │   └── base_model.dart        // 数据模型基类
│   ├── utils/
│   │   ├── screen_util.dart       // 屏幕适配
│   │   ├── log_util.dart          // 日志工具
│   │   └── storage_util.dart      // 本地存储
│   ├── network/
│   │   ├── dio_client.dart        // Dio封装
│   │   ├── api_exception.dart     // 异常处理
│   │   └── api_response.dart      // 统一响应体
│   └── theme/
│       ├── app_colors.dart        // 颜色常量
│       ├── app_text_style.dart    // 文字样式
│       └── app_theme.dart         // 主题配置
├── common/
│   ├── widgets/
│   │   ├── app_bar.dart           // 统一标题栏
│   │   ├── loading.dart           // 加载组件
│   │   └── empty_view.dart        // 空视图
│   └── values/
│       └── strings.dart           // 多语言
├── modules/                       // 业务模块
└── main.dart

核心模块实现

1. 统一标题栏 (common/widgets/app_bar.dart)
class CustomAppBar extends AppBar {CustomAppBar({String title = "",bool showBack = true,List<Widget>? actions,}) : super(title: Text(title, style: AppTextStyle.title),centerTitle: true,elevation: 0,backgroundColor: AppColors.primary,automaticallyImplyLeading: showBack,leading: showBack ? const BackButton(color: Colors.white) : null,actions: actions,);
}
2. 状态管理基类 (core/base/base_controller.dart)
import 'package:get/get.dart';abstract class BaseController extends GetxController {final isLoading = false.obs;final errorMessage = ''.obs;void setLoading(bool value) => isLoading.value = value;void handleError(dynamic error) {errorMessage.value = error.toString();setLoading(false);}void onClose() {isLoading.close();errorMessage.close();super.onClose();}
}
3. 页面基类 (core/base/base_view.dart)
abstract class BaseView<T extends BaseController> extends GetView<T> {const BaseView({Key? key}) : super(key: key);Widget build(BuildContext context) {return Scaffold(appBar: buildAppBar(),body: Obx(() {if (controller.isLoading.value) return const LoadingWidget();if (controller.errorMessage.isNotEmpty) {return ErrorView(message: controller.errorMessage.value);}return buildBody(context);}),);}PreferredSizeWidget? buildAppBar() => null;Widget buildBody(BuildContext context);
}
4. 网络请求封装 (core/network/dio_client.dart)
class DioClient {static final Dio _dio = Dio(BaseOptions(baseUrl: 'https://api.example.com',connectTimeout: 5000,receiveTimeout: 3000,))..interceptors.add(LogInterceptor())..interceptors.add(InterceptorsWrapper(onError: (error, handler) {throw ApiException.fromDioError(error);},));static Future<ApiResponse> get(String path, {Map<String, dynamic>? params}) async {try {final response = await _dio.get(path, queryParameters: params);return ApiResponse.success(response.data);} on ApiException catch (e) {return ApiResponse.failure(e.toString());}}// 其他请求方法...
}
5. 屏幕适配工具 (core/utils/screen_util.dart)
class ScreenUtil {static late double screenWidth;static late double screenHeight;static void init(BuildContext context) {final mediaQuery = MediaQuery.of(context);screenWidth = mediaQuery.size.width;screenHeight = mediaQuery.size.height;}static double scaleWidth(double size) => size * (screenWidth / 375);
}

使用示例

业务页面实现
class HomePage extends BaseView<HomeController> {const HomePage({Key? key}) :<
http://www.xdnf.cn/news/1212841.html

相关文章:

  • CVAE 回顾版
  • STM32学习记录--Day3
  • gaussdb demo示例
  • 大语言模型(LLM)技术架构与工程实践:从原理到部署
  • 深入剖析 Spark Shuffle 机制:从原理到实战优化
  • 智能矿山综合管控平台
  • 非凸科技受邀出席第九届AIFOF投资创新发展论坛
  • 剧本杀系统 App 开发:科技赋能,重塑剧本杀游戏体验
  • forge篇——配置
  • SpringBoot+Three.js打造3D看房系统
  • 光伏气象监测系统:当阳光遇见科技
  • 让科技之光,温暖银龄岁月——智绅科技“智慧养老进社区”星城国际站温情纪实
  • 《CLIP改进工作串讲》论文精读笔记
  • Shopify Draggable + Vue 3 完整指南:打造现代化拖拽交互体验
  • JVM——内存布局、类加载机制及垃圾回收机制
  • Spring AI 海运管理应用
  • SpringBoot收尾+myBatis plus
  • 2025年6月数据挖掘顶刊TKDE研究热点有哪些?
  • DDD中的核心权衡:模型纯度与逻辑完整性
  • IO复用实现并发服务器
  • 【音视频】WebRTC 开发环境搭建-Web端
  • 服务器与电脑主机的区别,普通电脑可以当作服务器用吗?
  • Python 程序设计讲义(36):字符串的处理方法——去除字符串头尾字符:strip() 方法、lstrip() 方法与rstrip() 方法
  • 原生微信小程序实现语音转文字搜索---同声传译
  • ERP架构
  • MySQL学习---分库和分表
  • 简述:关于二轮承包地确权二轮承包输出数据包目录结构解析
  • 《UE教程》第三章第五回——第三人称视角
  • 【编号65】广西地理基础数据(道路、水系、四级行政边界、地级城市、DEM等)
  • DooTask教育行业功能:开启高效学习协作新篇章