flutter - 在嵌套小部件中使用 GetxController 的最佳方式
问题描述
在我的 Flutter 应用程序中,我使用 GetxController 作为每个视图的视图模型:
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'track_activity_view_model.dart';
// Main widget of the view
class TrackActivityView extends StatelessWidget {
@override
Widget build(BuildContext context) {
return GetBuilder<TrackActivityViewModel>(
init: TrackActivityViewModel(),
builder: (viewModel) {
return SafeArea(
child: Scaffold(
appBar: AppBar(title: Text('Registra un\'attività')),
body: viewModel.serviceEnabled
? AskPermissionWidget()
: TrackingWidget(viewModel),
));
});
}
}
class AskPermissionWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return GetBuilder<TrackActivityViewModel>(
init: TrackActivityViewModel(),
builder: (viewModel) {
// Some code that use viewModel
return Container();
});
}
}
class TrackingWidget extends StatelessWidget {
final TrackActivityViewModel viewModel;
TrackingWidget(this.viewModel);
@override
Widget build(BuildContext context) {
// Some code that use viewModel
return Container();
}
}
当我写一些嵌套的小部件时,我想知道它是否更好
- 从头调用控制器 (AskPermissionWidget)
或者
- 将控制器作为参数传递(TrackingWidget)
有什么不同吗?
非常感谢你。
解决方案
在GetX 中,您无需再为依赖注入而苦苦挣扎(这是您所问的标题)。甚至它也是GetX 相对于其他软件包的主要优势之一。
您需要执行以下步骤来解决问题:
只需使用以下命令创建(并绑定)您的 ViewModel(或更好地命名为Controller):
一种。
Get.put
或顶部小部件Get.lazyPut
的构造函数或build
方法中使用的方法湾。 或者使用顶部小部件中的
init
参数来构造一个新的控制器GetBuilder
C。 或对任何页面使用Bindings来定义与该页面相关的Controller。
在子小部件中或使用
myViewModel = Get.find<MyViewModel>()
. 您不再需要在孩子中初始化它或在构造函数中传递它。它总能找到适合您的控制器。或者,如果您希望将其用于 in,GetBuilder
您可以GetBuilder
在不带任何init
参数或其他任何内容的情况下使用 child。只需在您的子小部件中写下:
return GetBuilder<TrackActivityViewModel>(
builder: (viewModel) {
// Some code that use viewModel
return Container();
});
GetBuilder 本身会为您找到合适的控制器。无需传递任何其他内容(在确保控制器在顶部小部件中初始化或者它是permanent
不会从内存中删除的控制器之后)。
是不是很简单?!正如我所提到的,这是GetX相对于其他状态管理包的主要优势。
注意:如果您想要单个Controller
类的多个实例,您将能够在or或or小部件中传递一个唯一tag
参数以唯一地定义,然后在子小部件或您想要找到它的任何地方使用该唯一来标识你想要哪一个。Get.put
Get.lazyPut
GetBuilder
GetX
Controller
tag
摘要: GetX 总能找到正确的控制器。
推荐阅读
- google-bigquery - 如何获取 Google Bigquery FQDN 项目 ID
- kubernetes - 不同命名空间上的 pod 之间的通信
- python - 使用单独打包的功能但共享代码打包无服务器 python 服务
- c# - BlackJack 卡组的单元测试
- javascript - 当按钮调用触发函数时,我的 appScript 不会生成我的 TimeBased autoSendMail 触发器
- php - 用laravel自动替换字符串中的变量
- spring - 如何在 Spring AOP 的切入点表达式中将基本包作为变量传递?
- android - USB 麦克风和设备的扬声器可以同时工作吗?
- java - 使用 openjdk 13.0.2 运行时,运行 .jar 文件会引发异常
- javascript - AngularJS ($http GET): $scope.names 始终是一个空数组,但调用后端是可以的