flutter-getx-template icon indicating copy to clipboard operation
flutter-getx-template copied to clipboard

项目不错: 有几个建议

Open hhstore opened this issue 2 years ago • 15 comments

  • 这个模板目录结构还可以.
  • 不过不确定你有没有看过官方的 get_cli 生成的模板目录.
    • get_cli 除了可以初始化目录, 还可以命令行添加 page/view/controller.
    • 我看你基于一个 js 的工具, 做脚手架.
  • 我早先也尝试自己定义一个目录, 不过试用官方的get_cli生成的目录. 还是决定用官方的目录了.

get_cli 支持的指令:

  • 我不确定你有使用过这些指令麽.
  • 这些指令已经足够好用. 我是建议你可以把这个 repo 里, 新增的特性, 提交给官方的脚手架.

  get-create-project:
    cmds:
      - get create project:my_app

  # 初始化 app 目录:
  get-init:
    cmds:
      - get init
      - task: mkdir
        vars: {FOLDER: "lib/app/data/locales"}

  # 代码格式化:
  get-sort:
    cmds:
      - get sort

  get-gen-locales:
    desc: "generate multi language(i18n)"
    cmds:
      - get generate locales assets/locales on data/locales

  get-add-page:
    cmds:
      - get create page:$PAGE_NAME # set from .env(check .env.local)

  get-add-sub-page:
    cmds:
      - get create page:$PAGE_NAME on $PAGE_PATH

  get-add-controller:
    cmds:
      - get create controller:$VIEW_NAME on $VIEW_PATH

  get-add-view-only:
    cmds:
      - get create view:$VIEW_NAME on $VIEW_PATH

  get-add-view:
    cmds:
      - task: get-add-view-only
      - task: get-add-controller

  get-provider:
    cmds:
      - get create provider:$PROVIDER_NAME on data

  get-gen-model:
    cmds:
      #- get generate model with assets/models/wallet_address_asset_entity.json --skipProvider
      - get generate model with $MODEL_JSON_FILE_PATH --skipProvider

几个优化点:

  • 多语言: 官方的 get_cli 支持生成: 不需要手动管理
get generate locales assets/locales on data/locales

  • 基于官方脚手架添加页面, 会自动更新 router.
  • main 文件: Global.init().then() 是个好写法. 不过. 其实 Global 不需要这样定义.
    • Get.put(), Get.lazyPut() 可以 put 任何东西, 包括全局变量集.
    • 你可以后续使用 Get.find() 方式, 在项目任意位置访问到. 其实间接实现全局变量的效果.
    • 这样会更方便.
Get.lazyPut<HomeController>(() => HomeController());

anyway:

  • 不是来吵架的哈. 我是看到有同样喜欢 GetX 的开发者. 过来看一下. 😄
  • 另外, 我创建了一个技术讨论组 gossipcoder. 欢迎加入一起来讨论技术, flutter 或者其他.
  • https://github.com/hhstore/blog/issues/309

discord 讨论组:

  • https://discord.gg/MnDA9pfWAW
  • 删掉了 keybase 的讨论组, 迁移到 discord.
  • 之前选择 keybase, 是觉得没被墙. 还是不够稳定

hhstore avatar Aug 11 '21 02:08 hhstore

keybase是啥?discord不蛮好的么。。。

使用get_cli可能会方便一些,自己创建模板也没问题,个人习惯而已。

KevinZhang19870314 avatar Aug 18 '21 02:08 KevinZhang19870314

keybase是啥?discord不蛮好的么。。。

使用get_cli可能会方便一些,自己创建模板也没问题,个人习惯而已。

  • keybase 是个小众 app, 决定弃用了(消息同步不稳定). 迁移到 discord. 如果你有使用 discord, 欢迎加群交流.
  • https://discord.gg/MnDA9pfWAW
  • 哈哈, 其实是建议项目作者, 把这个模板里重要的部分, PR 到 官方的 get_cli, 这样用起来也方便. 😄

hhstore avatar Aug 18 '21 03:08 hhstore

还有一点是 官方的 get_cli 生成的模板结构. 总体是很好用的. 与官方保持一致, 后续更好维护, 毕竟以后会有更多的特性引入.

hhstore avatar Aug 18 '21 03:08 hhstore

@hhstore 非常感谢你的支持与建议!

  • getx cli我看过了,的确功能很多,更新得也及其快,我现在去看,已经比我当时看,多了很多特性。我这边后续的计划是,关注getx cli的更新,会加入一些比较好的功能,我个人不太喜欢把工具做得太过复杂。
  • 另外对于你说的 Global.init().then() ,我是知道“Get.put(), Get.lazyPut() 可以 put 任何东西”这一点的,这个就看个人习惯了,我这里考虑的是,代码更加适应于新手,另外也得让这个 template 尽可能的轻,所以才选择了这样的方式。
  • 针对你说的 与官方保持一致, 后续更好维护, 毕竟以后会有更多的特性引入.,这里其实我这套架构方式,是遵循了阿里的umi的架构方式,偏前端,所以这套架构方式,可能会更适合前端接受😄
  • 最后,如果有更好的建议,可以继续讨论!

xieyezi avatar Sep 01 '21 01:09 xieyezi

写得真好,点🌟了

huangcx708 avatar Sep 01 '21 02:09 huangcx708

@hhstore 非常感谢你的支持与建议!

  • getx cli我看过了,的确功能很多,更新得也及其快,我现在去看,已经比我当时看,多了很多特性。我这边后续的计划是,关注getx cli的更新,会加入一些比较好的功能,我个人不太喜欢把工具做得太过复杂。
  • 另外对于你说的 Global.init().then() ,我是知道“Get.put(), Get.lazyPut() 可以 put 任何东西”这一点的,这个就看个人习惯了,我这里考虑的是,代码更加适应于新手,另外也得让这个 template 尽可能的轻,所以才选择了这样的方式。
  • 针对你说的 与官方保持一致, 后续更好维护, 毕竟以后会有更多的特性引入.,这里其实我这套架构方式,是遵循了阿里的umi的架构方式,偏前端,所以这套架构方式,可能会更适合前端接受😄
  • 最后,如果有更好的建议,可以继续讨论!
  • 😄

  • getx cli 可用性蛮高了, 我开始折腾了一个项目模板结构, 后面还是放弃了. 🐶

  • 关于 Get.put() 和 Get.find() 这种使用方式. 我最近有个新的实践收获:

    • 基于 Get.put() 的方式, 控制好, 很容易对 Controller 层, 写单元测试.
    • 这样按照 view -> controller -> service, 其实除了 view 的样式层. 其他 logic 部分. 都可以写单元测试了.
    • 具体搭配 go 的 newClass() 的写法.
    • 可供参考.
  • 我认为写易于测试的代码, 对于保证质量和提高效率, 有帮助, 这样就不需要到 UI 交互才能测试.

  • io 对象层: new() 方法, 同时调用 Get.put() 存入全局 cache, 这样便于访问资源.

image

  • io 读写层:

image




  • service 功能层:

image

  • 按照我这种写法. 除了 view 层(UI+样式), 其他各层, 都可以写单元测试覆盖.
  • 单元测试里, 只需要调用 每层的 new() 方法. 利用 Get.find() 这个全局 cache 效果.
  • 单元测试很好写.

hhstore avatar Sep 01 '21 02:09 hhstore

  • Get.put() 和 Get.find() 某种程度上, 实现了 new()/set() 和 get() 的解耦.
  • 是一种异步思想(类似消息队列的效果)
  • GetX 作者本人, 以前是写后端的. so, 这个模式, 后端很熟悉.
  • GetX 里很多特性设计, 都是比较方便写单元测试的.

hhstore avatar Sep 01 '21 02:09 hhstore

@hhstore 你的思路很棒,的确完全是后端的思路,可以将Global抽象成全局services然后用getx put的方式注入。 学习了!

xieyezi avatar Sep 01 '21 02:09 xieyezi

可以加你联系方式请教下么

huangcx708 avatar Sep 01 '21 02:09 huangcx708

可以加你联系方式请教下么

@huangcx708 可以email沟通

xieyezi avatar Sep 01 '21 02:09 xieyezi

可以加你联系方式请教下么

https://discord.gg/MnDA9pfWAW

我这里有个 discord 的技术交流群. 可以来这里交流, 邀请了很多 flutter 的开发. 也有其他语言的开发者.

@xieyezi 也欢迎大佬加入. 切磋学习.

hhstore avatar Sep 01 '21 02:09 hhstore

@hhstore 你的思路很棒,的确完全是后端的思路,可以将Global抽象成全局services然后用getx put的方式注入。 学习了!

  • 是的. 我是看了 Get.put() 的源码. 以及 routes 相关的实现. 然后发现. Get.put<> 可以干很多事情.
  • 你其实可以把他当个 redis 使用. 都是没问题的. 这样其实可以对 app 的启动性能, 做很多优化.
  • GetX 的对性能优化的很多技巧, 都很符合后端常用讨论.
  • 😄

hhstore avatar Sep 01 '21 02:09 hhstore

Get.put()Get.find()的确可以用来做很多事情,比如上面所说的全局cache,他放在了一个Map结构来存储,但是如果被滥用了的话,内存很逐渐变大且无法释放。 Get.put() & Get.find()一般可以正常的put/get Controller,因为Controller有lifecycle可以随着页面的销毁而释放,也可以自行释放。如果是作为put/get全局services使用,建议结合GetRoute的Bindings来使用,这样Get会自动为你管理内存。当然少量使用是没有问题,我这里说的是best practice。

KevinZhang19870314 avatar Sep 01 '21 06:09 KevinZhang19870314

Get.put()Get.find()的确可以用来做很多事情,比如上面所说的全局cache,他放在了一个Map结构来存储,但是如果被滥用了的话,内存很逐渐变大且无法释放。 Get.put() & Get.find()一般可以正常的put/get Controller,因为Controller有lifecycle可以随着页面的销毁而释放,也可以自行释放。如果是作为put/get全局services使用,建议结合GetRoute的Bindings来使用,这样Get会自动为你管理内存。当然少量使用是没有问题,我这里说的是best practice。

  • 对的.
  • 作为全局 cache 使用, 就不要 继承自 GetxController + permanent=true 参数 , 可以选择 GetxService.不过这样含义就有迷惑性.
  • 我是自定义一个类似 AppCache() 的类. 然后, Get.put<> +permanent=true 使用.
  • 基于 GetX, 就不再需要单独引入 全局 cache 之类的工具包.
  • 整体利用 GetX 全家桶. 倒是很方便的.
  • hive 我也不用了, 类似 protobuf 的方式, 有点繁琐. GetStorage 基本够用.
  • 我也尝试优化基于 GetX 的实践方式.
  • 大家可以多探讨交流最佳实践的用法. 😄

hhstore avatar Sep 01 '21 07:09 hhstore

关于 GetRoute的Bindings来使用:

  • 我实践下来. 有点不喜欢 Get.toNamed() 这种路由方式. 虽然他自带 Bindings, 挺方便.
  • 原因是:
    • 代码跳转的时候, 会断掉. 找不到哪里在使用. 只能全局搜索. 有点不方便.
    • 单元测试. 如果使用 Bindings, 对 Controller 写单元测试, 就有干扰. 有侵入性.
  • 我一般除了1级页面. 用 Get.toNamed() 方式.
  • 其他页面. 都尽量选择 Get.to(), 手动管理 Get.put<Controller>().
  • 这样调试, 方便找代码. 灵活增/删 page/Controller. 不然要同步更新(增/删) GetRoute 的路由表.
  • 当然. 这个只是个人喜好.

hhstore avatar Sep 01 '21 07:09 hhstore