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

时间:2021-05-10 14:43:25

标签: flutter dart 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();
  }
}

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

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

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

有什么不同吗?

非常感谢。

1 个答案:

答案 0 :(得分:2)

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

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

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

    a. 构造函数中使用的 Get.putGet.lazyPut 方法或 top 小部件的 build 方法

    b. 或使用 top 小部件中 initGetBuilder 参数构建新控制器

    c. 或对任何页面使用 Bindings 来定义与该页面相关的 Controller

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

    return GetBuilder<TrackActivityViewModel>(
        builder: (viewModel) {
          // Some code that use viewModel
          return Container();
        });

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

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

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

总结: GetX 总能找到合适的控制器。