在嵌套小部件中使用 GetxController 的最佳方法

Bob*_*obo 5 dart flutter flutter-getx

在我的 Flutter 应用程序中,我使用 GetxController 作为每个视图的 viewModel:

\n
import \'package:flutter/material.dart\';\nimport \'package:get/get.dart\';\n\nimport \'track_activity_view_model.dart\';\n\n// Main widget of the view\nclass TrackActivityView extends StatelessWidget {\n  @override\n  Widget build(BuildContext context) {\n    return GetBuilder<TrackActivityViewModel>(\n        init: TrackActivityViewModel(),\n        builder: (viewModel) {\n          return SafeArea(\n              child: Scaffold(\n            appBar: AppBar(title: Text(\'Registra un\\\'attivit\xc3\xa0\')),\n            body: viewModel.serviceEnabled\n                ? AskPermissionWidget()\n                : TrackingWidget(viewModel),\n          ));\n        });\n  }\n}\n\nclass AskPermissionWidget extends StatelessWidget {\n  @override\n  Widget build(BuildContext context) {\n    return GetBuilder<TrackActivityViewModel>(\n        init: TrackActivityViewModel(),\n        builder: (viewModel) {\n          // Some code that use viewModel\n          return Container();\n        });\n  }\n}\n\nclass TrackingWidget extends StatelessWidget {\n  final TrackActivityViewModel viewModel;\n\n  TrackingWidget(this.viewModel);\n\n  @override\n  Widget build(BuildContext context) {\n    // Some code that use viewModel    \n    return Container();\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

当我编写一些嵌套小部件时,我想知道它是否更好

\n
    \n
  1. 从头调用控制器 (AskPermissionWidget)
  2. \n
\n

或者

\n
    \n
  1. 将控制器作为参数传递(TrackingWidget)
  2. \n
\n

有什么区别吗?

\n

非常感谢。

\n

Hos*_*adi 13

GetX中,您无需再为依赖注入而烦恼(这是您所要求的标题)。这甚至是GetX相对于其他软件包的主要优势之一。

您需要执行以下步骤来解决问题:

  1. 只需使用以下命令创建(并绑定)您的 ViewModel(或更好的命名控制器):

    A。 Get.put顶部小部件的构造函数或方法Get.lazyPut中使用的方法build

    b. 或者使用顶部小部件中init的参数来构建新的控制器GetBuilder

    C。 或使用任何页面的Bindings来定义与该页面相关的Controller

  2. 在子小部件或其他任何地方使用找到您的控制器myViewModel = Get.find<MyViewModel>()。您不再需要在子级中初始化它或在构造函数中传递它。它总能找到适合您的控制器。或者,如果您希望将其用于GetBuilder您可以GetBuilder在子项中使用,而不需要任何init参数或其他任何内容。只需在您的子小部件中写入以下内容:

    return GetBuilder<TrackActivityViewModel>(
        builder: (viewModel) {
          // Some code that use viewModel
          return Container();
        });
Run Code Online (Sandbox Code Playgroud)

GetBuilder 本身会为您找到合适的控制器。无需传递任何其他内容(在确保控制器在顶部小部件中初始化或者它是permanent不会从内存中删除的控制器之后)。

是不是很简单?!正如我所提到的,这是GetX相对于其他状态管理包的主要优势。

注意:如果您想要单个Controller类的多个实例,您可以在或或小部件中传递唯一tag参数来唯一定义,然后在子小部件或您想要找到它的任何地方使用该唯一的来标识你想要哪一个。Get.putGet.lazyPutGetBuilderGetXControllertag

摘要: GetX 总是能找到正确的控制器。