Flutter目录及开发结构

一、前言

首先先看一下flutter自带的目录

文件或目录说明
.dart_tool记录了一些dart工具库所在的位置和信息
.ideaandroid studio 是基于idea开发的,.idea 记录了项目的一些文件的变更记录
androidAndroid项目文件夹
iosiOS项目文件夹
liblib文件夹内存放我们的dart语言代码
test用于存放我们的测试代码
.gitignoregit忽略配置文件
.metadataIDE 用来记录某个 Flutter 项目属性的的隐藏文件
.packagespub 工具需要使用的,包含 package 依赖的 yaml 格式的文件
flutter_app.iml工程文件的本地路径配置
pubspec.lock当前项目依赖所生成的文件
pubspec.yaml当前项目的一些配置文件,包括依赖的第三方库、图片资源文件等
README.mdREADEME文件

这就是flutter自带的目录,大概接触过的都懂。但是,在开发中如何编写目录更为重要,也就是lib内如何将代码分配及编写。一个良好的目录结构能让人快速上手,也能让开发人员快速对过往代码进行优化。接下来就是我习惯性的代码结构。

二、开发目录结构

1 data

这里面包含实体类、网络请求及相关方法或结构

文件或目录说明
model实体类数据结构,toJson或fromJson
api网络请求,eg. dio请求封装
services网络请求结构封装,eg. dio请求封装
(1) model

以下以一个用户的实体类来举例(空安全

class UserInfo {
  int? id;
  String? img;
  String? thumbimg;
  String? userName;
  String? intro;

  UserInfo({this.id, this.img, this.thumbimg, this.userName, this.intro});

  UserInfo.fromJson(Map<String, dynamic> json) {
    memberId = json['id'];
    img = json['img'];
    thumbimg = json['thumbimg'];
    userName = json['userName'];
    intro = json['intro'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['id'] = this.id;
    data['img'] = this.img;
    data['thumbimg'] = this.thumbimg;
    data['userName'] = this.userName;
    data['intro'] = this.intro;
    return data;
  }
}

之前同事找到了一个快速生成实体类的网站,是个很不错的网站:JsonToDart

(2) api

主要为网络请求封装,以下为实例

static Future<Map<dynamic, dynamic>> testApi(args, er) async {
  var response = await HttpUtil().post(
    '/testApi',
    {
      "args": args,
      "er": er
    }
  );
  return response;
}
(3) services

封装网络请求及相关组件

class HttpUtil {

  Dio? dio;
  static HttpUtil _instance = HttpUtil._internal();
  factory HttpUtil() => _instance;

  HttpUtil._internal() {
    // BaseOptions、Options、RequestOptions 都可以配置参数,优先级别依次递增,且可以根据优先级别覆盖参数
    BaseOptions options = new BaseOptions(
      // 请求基地址,可以包含子路径
      baseUrl: baseUrl,

      // baseUrl: storage.read(key: STORAGE_KEY_APIURL) ?? SERVICE_API_BASEURL,
      //连接服务器超时时间,单位是毫秒.
      connectTimeout: 10000,

      // 响应流上前后两次接受到数据的间隔,单位为毫秒。
      receiveTimeout: 5000,

      // Http请求头.
      headers: {
        HttpHeaders.acceptHeader:"accept: multipart/form-data"
      },

      /// 请求的Content-Type,默认值是"application/json; charset=utf-8".
      /// 如果您想以"application/x-www-form-urlencoded"格式编码请求数据,
      /// 可以设置此选项为 `Headers.formUrlEncodedContentType`,  这样[Dio]
      /// 就会自动编码请求体.
      contentType: 'application/json; charset=utf-8',

      /// [responseType] 表示期望以那种格式(方式)接受响应数据。
      /// 目前 [ResponseType] 接受三种类型 `JSON`, `STREAM`, `PLAIN`.
      ///
      /// 默认值是 `JSON`, 当响应头中content-type为"application/json"时,dio 会自动将响应内容转化为json对象。
      /// 如果想以二进制方式接受响应数据,如下载一个二进制文件,那么可以使用 `STREAM`.
      ///
      /// 如果想以文本(字符串)格式接收响应数据,请使用 `PLAIN`.
      responseType: ResponseType.json,
    );

    dio = new Dio(options);

    // Cookie管理
    // CookieJar cookieJar = CookieJar();
    // dio.interceptors.add(CookieManager(cookieJar));
  }

  /// restful get 操作
  Future get(
      String path,
      {
        Options? options,
      }) async {
    var response = await dio!.post(
      path,
      options: options,
    );
    return response.data;
  }

  /// restful post 操作
  Future post(
      String path,
      dynamic data,
      {
        Options? options,
      }) async {
    var response = await dio!.post(
      path,
      queryParameters: data,
      options: options,
    );
    return response.data;
  }
}

2 utils

主要为封装的方法或组件

文件或目录说明
method例如加密策略、计算缓存大小、获取手机和应用信息等方法
widget例如封装Text组件、toast信息、获取头部安全距离等组件

3 theme

软件相关的方法或组件

文件或目录说明
utils例如通用依赖包引用、自适应适配宽高单元、多语言等
values例如通用色值、静态资源、全局变量(eg.evenbus)等

4 routes

软件相关的方法或组件

文件或目录说明
app_routes路由名称或别名
app_pages路由绑定、初始化首个页面等

5 modules

主要页面,比如登录页面、我的页面等

以下为登录页面module

(1) login_bindings

主要为将controller初始化

(2)login_controller

类似于MVC内C层

(3)login_page

登陆页面

三、总结构

  • app
    • data
      • api
      • model
      • services
    • modules
      • login_module
        • login_bindings
        • login_controller
        • login_page
    • routes
      • app_routes.dart
      • app_pages.dart
    • theme
      • utils
      • values
    • utils
      • method
      • widget
  • main.dart
  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Flutter 开发规范是指在使用 Flutter 框架进行应用程序开发时,遵循一定的规范和约定,以提高代码质量和可维护性。以下是一些常见的 Flutter 开发规范: 1. 项目结构:建立良好的项目结构,包括将代码和资源文件组织在不同的目录中,例如将页面文件放在一个名为 "pages" 的目录下,将组件文件放在一个名为 "widgets" 的目录下等。 2. 命名规范:使用一致的命名规范,可见性和含义清晰的变量、函数和类名。例如使用小写字母和下划线来命名变量和函数,使用大写字母开头的驼峰命名法来命名类。 3. 代码风格:遵循一致的代码风格,例如缩进、空格和换行的使用。可以使用 Flutter 官方推荐的 Dart 代码风格指南作为参考。 4. 注释说明:在函数和类的开头添加必要的注释,解释功能和用途,提高代码的可读性和可维护性。 5. 状态管理:合理使用状态管理的方式,例如使用 Provider 或 BLoC 模式来管理应用程序中的状态,避免状态分散和混乱。 6. 代码复用:尽量使用组件化的思想,将常用的 UI 元素封装成可复用的 Widget,提高代码的复用性和可扩展性。 7. 错误处理:对于可能发生错误的操作,及时捕获和处理异常,给用户友好的提示信息。 8. 性能优化:优化应用程序的性能,在组件刷新、网络请求等方面尽量减少不必要的开销,提高用户体验。 9. 国际化:为了适应多语言环境,将文本和字符串抽离到国际化文件中,方便后续的本地化工作。 10. 版本管理:使用版本控制工具,例如 Git ,管理项目的代码,方便团队协作和代码回滚。 以上是一些常见的 Flutter 开发规范,遵循这些规范可以提高代码质量,增加代码的可读性和可维护性,促进团队合作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

倾云鹤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值