【Flutter】Getx设计模式及Provider、Repository、Controller、View等

本文介绍了使用Getx4进行Flutter项目的状态管理和数据流设计,重点讲解了Provider、Repository、Controller和ViewModel的角色,以及如何通过这些组件简化业务逻辑和提高测试性。

本文基于Getx 4,x 本本

1、引入

再次接触到Flutter项目,社区俨然很完善和活跃。pubs.dev 寻找状态管理的时候看到很熟悉的Getx时间,俨然发现Getx的版本已到是4.x版本,看到Getx的功能已经非常强大了,庞大的API俨然成为一种开发框架,关于API不是本文介绍的目的。我们就去繁从简,看看从框架层次,作者想传递给我们什么开发思想呢。

2、官方示例

2.1示例结构

Get示例图

2.2 目录结构

目录结构

2.3 总结

移动端 或者前端很少去直接操作远程数据, 故不存在类似Spring 中的DAO, 此处示例中抽象出的Provider 我们可以理解为服务提供者即此处的网络请求Service,亦或者DBService的上层服务提供者。

provider

2.3.1 Repository

关于上述的Provider 层, 从2.1中我们看到了,还有一层Repository,那我们就开始唠唠这个Repository设计模式。 JJ关于此处Repository 模式大概有以下几点。

  • 简化业务层(Controller)的数据处理逻辑DTO

可能有人会说了,Provider层已经将Json转换成Model 了,那这里怎么提效呢。Model 能可能并不完全是前端展现的Entity,比如Model 中含有JsonString

  • 提高测试性
    便于Mock仓储对象,来模拟数据访问想过
  • 数据隔离的作用
    这个是我YY的,原始数据的immutable。

2.3.2 Controller

关于Controller, 从2.1 中我们看到了GetxController混淆的两个协议,主要是生命周期的监听。此处GetxContorller 不展开讲。

2.3.3 View

getx 有个与之对应的GetView, 可以帮我们注入对应的Controller。此处需要注意的是,如果该View有多个Controller管理,那还是采用Get.put Get.lazyPut, Get.creat来注入实例。

2.3.4 Bindings


class HomeBindings extends Bindings {
   
   
  
  void dependencies() {
   
   }
}

通过Get.LazyPut 来注入实例。依次为Provider. -> Reposity -> Contorller, 需要注意的是如果在首页用到Binding initialBinding, 需要实例话。

3、JJ的示例

看到这里就没必要在看下去了,自己可以造个轮子。这里只是为了记录一下。

3.1 Presentation

3.1.1 View
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:xun_dian_ft/global_widgets/tabbar/presentation/controller/tabbar_controller.dart';
import 'package:xun_dian_ft/pages/home/presentation/view/mine_view.dart';
import 'package:xun_dian_ft/pages/home/presentation/view/notice_View.dart';
import 'package:xun_dian_ft/pages/home/presentation/view/process_view.dart';
import 'package:xun_dian_ft/pages/home/presentation/view/wrok_view.dart';

/// @brief: 自定义底部导航栏视图
/// @desc: 因iOSer 故定义成和iOS类名
/// @date: 2024-04-05 19:27
/// @author: jeversonjee
class TabbarWidget extends GetView<TabbarController> {
   
   
  final TextStyle normalTextStyle = const TextStyle(color: Colors.grey, fontWeight: FontWeight.w500, fontSize: 12);
  final TextStyle highlightTextStyle = const TextStyle(color: Colors.red, fontWeight: FontWeight.w700, fontSize: 16);
  final List<BottomNavigationBarItem
### 如何在 Flutter 中使用 GetxController #### 创建业务逻辑控制器 为了创建一个不依赖于 `GetxController` 类的自定义控制器,在 Flutter 应用程序中,可以通过简单地定义一个新的 Dart 文件来实现这一点。在这个文件里声明一个普通的类作为控制器,并且可以在其中定义用于管理应用状态的数据成员以及处理业务逻辑的方法[^1]。 ```dart class MyCustomController { int count = 0; void incrementCounter() { count++; // 更新UI或其他操作 } } ``` #### 初始化并获取实例 为了让其他部件能够访问这个控制器中的属性函数,通常会采用单例模式或者通过依赖注入的方式提供全局可访问的对象。对于 GetX 而言,则推荐利用其内置的支持来进行初始化: - 使用 `Get.put()` 方法注册服务; - 或者借助命名路由参数传递特定页面所需的 controller 实例; 下面是一个例子展示如何在一个 StatefulWidget 内部完成上述过程。 ```dart import 'package:get/get.dart'; // 假设已经按照前面部分完成了MyCustomController类的编写 void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return GetMaterialApp( home: Scaffold( appBar: AppBar(title: Text('GetX Example')), body: Center(child: CounterPage()), ), ); } } class CounterPage extends StatelessWidget { final myCtrl = Get.put(MyCustomController()); // 注册controller @override Widget build(BuildContext context) { return Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Obx(() => Text('You have pushed the button this many times: ${myCtrl.count}')), // 绑定数据到视图 ElevatedButton(onPressed: () { myCtrl.incrementCounter(); }, child: Text('Increment')) ], ); } } ``` 这里需要注意的是,虽然可以直接修改 `count` 变量而不需要标记它为 `.obs` 属性也不必显式调用任何更新方法,但是当涉及到界面刷新时还是应该考虑使用响应式的编程方式以便更高效地同步模型层的变化至视图层。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值