在嵌套小部件中使用 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();
  }
}

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

  1. 重新调用控制器 (AskPermissionWidget)

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

有什么不同吗?

非常感谢。

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

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

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

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

    b. 或在 top 小部件中使用 GetBuilderinit 参数构造一个新控制器

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

  2. 在 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.putGet.lazyPut 或在 GetBuilderGetX 小部件中唯一定义 Controller 然后在 child 小部件或任何您想要的地方发现它使用唯一 tag 来确定您想要哪一个。

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