首页 > 解决方案 > 在嵌套小部件中使用 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();
  }
}

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

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

或者

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

有什么不同吗?

非常感谢你。

标签: flutterdartflutter-getx

解决方案


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

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

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

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

    湾。 或者使用顶部小部件中的init参数来构造一个新的控制器GetBuilder

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

  2. 在子小部件中或使用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.putGet.lazyPutGetBuilderGetXControllertag

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


推荐阅读