在嵌套小部件中使用 GetxController 的最佳方式
Best way to use GetxController in nested widget
在我的 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(或更好地命名为 Controllers)使用:
a. Get.put
或 Get.lazyPut
构造函数中使用的方法或 top[=74 的 build
方法=] 小部件
b. 或在 top 小部件中使用 GetBuilder
的 init
参数构造一个新控制器
c. 或对任何页面使用 Bindings 来定义与该页面相关的 Controller。
在 child 小部件或使用 myViewModel = Get.find<MyViewModel>()
的其他任何地方找到您的 控制器 。您不再需要在 child 中初始化它或在构造函数中传递它。它总能为您找到合适的 Controller。或者,如果您希望它在 GetBuilder
中使用,您可以在 child 中使用 GetBuilder
,而无需任何 init
参数或任何其他参数。只需将此写在您的 child 小部件中即可:
return GetBuilder<TrackActivityViewModel>(
builder: (viewModel) {
// Some code that use viewModel
return Container();
});
并且 GetBuilder 本身会为您找到合适的 Controller。不需要传递任何其他东西(在你确保控制器在顶部小部件中初始化或者它是一个不会从内存中删除的 permanent
控制器之后)。
是不是很简单?!正如我提到的,这是 GetX 相对于其他状态管理包的主要优势。
注意: 如果你想要单个 Controller
class 的多个实例,你可以传递一个唯一的 tag
parameter Get.put
或 Get.lazyPut
或在 GetBuilder
或 GetX
小部件中唯一定义 Controller
然后在 child 小部件或任何您想要的地方发现它使用唯一 tag
来确定您想要哪一个。
总结: GetX总能找到合适的控制器。
在我的 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(或更好地命名为 Controllers)使用:
a.
Get.put
或Get.lazyPut
构造函数中使用的方法或 top[=74 的build
方法=] 小部件b. 或在 top 小部件中使用
GetBuilder
的init
参数构造一个新控制器c. 或对任何页面使用 Bindings 来定义与该页面相关的 Controller。
在 child 小部件或使用
myViewModel = Get.find<MyViewModel>()
的其他任何地方找到您的 控制器 。您不再需要在 child 中初始化它或在构造函数中传递它。它总能为您找到合适的 Controller。或者,如果您希望它在GetBuilder
中使用,您可以在 child 中使用GetBuilder
,而无需任何init
参数或任何其他参数。只需将此写在您的 child 小部件中即可:
return GetBuilder<TrackActivityViewModel>(
builder: (viewModel) {
// Some code that use viewModel
return Container();
});
并且 GetBuilder 本身会为您找到合适的 Controller。不需要传递任何其他东西(在你确保控制器在顶部小部件中初始化或者它是一个不会从内存中删除的 permanent
控制器之后)。
是不是很简单?!正如我提到的,这是 GetX 相对于其他状态管理包的主要优势。
注意: 如果你想要单个 Controller
class 的多个实例,你可以传递一个唯一的 tag
parameter Get.put
或 Get.lazyPut
或在 GetBuilder
或 GetX
小部件中唯一定义 Controller
然后在 child 小部件或任何您想要的地方发现它使用唯一 tag
来确定您想要哪一个。
总结: GetX总能找到合适的控制器。