Thinh Flutter 模板 2.0

这个Flutter模板是为了减少开发过程、工作量和初始时间而编写的。该模板还提供了丰富的外部功能、简洁易读的结构。

安装

  1. 克隆项目(考虑使用模板)。
  2. 更改项目中出现的所有包名。
  3. 更新应用程序的资源。

文件夹结构

项目文件夹结构使用按结构划分文件夹的方法。

1. App 该文件夹包含应用程序中的所有功能。此目录的每个子文件夹都是一个独立的功能,其中common目录是通用的,可以被其他文件夹共享。

2. Base 此目录包含所有具有基本功能的基类,这些基类可以在开发过程中实现。

3. Config 该文件夹充当项目的资源库,包含

  1. 路由
  2. 颜色
  3. 尺寸
  4. 主题
  5. 语言
  6. 环境
  7. 常量
  8. 等等..

4. Generated

警告!!! 请勿修改此文件夹,因为它将在应用程序运行时自动生成。

6. Services

包含应用程序的所有服务,包括但不限于

  1. 对话框服务
  2. 共享偏好设置
  3. REST API服务

7. Utils

包含所有可以共享和重用于其他项目的辅助类。

8. App Runner app_runner.dart是应用程序的根目录。它包含实例化应用程序及其依赖项的块。

如何使用

前提条件

该模板遵循测试驱动开发流程和MVP架构。因此,了解以上两个概念的基础知识至关重要。

实现功能

应用程序的所有功能都放在app文件夹中。每个功能都分成三个不同的文件夹,分别命名为domain、data、presentation,用途不同。

  1. Domain – 业务层所在处 包含两个子目录,分别命名为entities和services:

    - Entities: The core entity of the feature, used to display to view.
    - Services: A contract to communicate between domain layer and data layer.
    
  2. Data – 功能的 数据源 包含两个子目录,分别命名为services、models和dto(可选):

    - Services: The implementation of service specified in the domain folder.
    - Models: A model that is returned from application's boundary such as from API, local storage
    
  3. Presentation – 功能的视图 包含三个子目录,分别命名为pages、business-logic-handler、widgets:

    - pages: Contains pages of the features
    - business-logic-handler: This is the component communicates with domain layer and depends on the state managment, whether it could be a bloc, provider, controller, etc...
    - widgets (optional):  contains widgets used accross pages
    

处理API / 数据处理程序

通常,在使用Provider时,我们经常需要处理在API执行之前/之后进行导航的情况(例如:显示加载,显示对话框……)。默认情况下,Provider包仅支持在状态更改时重新加载UI,而不支持在公开新状态时进行导航(类似于BlocListener)。因此,使用apiCallSafety可以避免此问题。

  1. 将API调用函数从UI包装在apiCallSafety方法中(在ApiError mixin中)
  2. 通过提交这些回调的实现来处理调用流程
    1. Future<void> Function()? onStart 在执行API之前调用。

    2. Future<void> Function()? onCompleted 在API执行完成后立即调用。

    3. Future<void> Function(T? res)? onSuccessonCompleted之后成功调用。

    4. Future<void> Function(dynamic error)? onErroronCompleted之后出错调用。

    5. Future<void> Function()? onFinally 最后调用,无论成功还是失败。

    6. Future<bool> Function()? unauthorized 当API返回401 – 未授权时调用。如果希望转发到应用程序身份验证失败处理程序,则返回true,否则将忽略。

  3. 如果需要,请通过状态实现API错误处理程序。

应用程序配置

根据应用程序的规格,您将需要修改多个值和配置以满足要求。

修改环境变量

  • 根据开发和生产阶段,您需要更新env
  • 要切换阶段,请创建一个新的环境主文件,例如此示例
AppConfig(env: Env.dev());
  • 要添加更多环境,只需将其添加到env文件夹中,遵循结构并使用指定的新的main_env.dart文件更新env_type.dart

从环境运行应用程序

要在开发环境中运行应用程序,请考虑

flutter run --release -t lib/main_prod.dart

配置本地化

  1. 要添加更多本地化(语言、资源),请转到translation文件夹并添加新的language-code.json文件或修改现有的资源。例如:en.json

  2. 使用此命令生成密钥

flutter pub run easy_localization:generate -S assets/translations -o locale_keys.g.dart -f keys 
  1. 将密钥转换为字符串资源
tr(LocaleKeys.key_name)

路由

由于应用程序遵循按功能划分文件夹的结构,因此每个页面都包含一个不同的业务逻辑处理程序。对于此项目,我们在routes.dart中实例化它。

要为应用程序添加命名路由,请修改rooutes.dart文件中的onGenerateRoute函数。

基本API响应模型。

应用程序的RestAPI服务依赖于定义的Base模型。您可以通过修改base_response.dart来覆盖此模型。服务器错误也将被解析为模型

应用程序依赖项

Flutter 3.3.0 • channel stable • https://github.com/flutter/flutter.git
Framework • revision ffccd96b62 (5 days ago) • 2022-08-29 17:28:57 -0700
Engine • revision 5e9e0e0aa8
Tools • Dart 2.18.0 • DevTools 2.15.0

flutter_screenutil: ^5.5.4
responsive_framework: ^0.2.0
easy_localization: ^3.0.0
dio: ^4.0.6
provider: ^6.0.2
get_it: ^7.2.0
intl: ^0.17.0
google_fonts: ^3.0.1
shared_preferences: ^2.0.15
logger: ^1.1.0

许可证

麻省理工学院许可证

版权所有 © 2022 Le Hoang Thinh

本项目免费使用,可用于商业用途,但是,请添加许可证并在将此模板应用于生产应用程序之前与我联系。

GitHub

查看 Github