【问题标题】:Best way to use GetxController in nested widget在嵌套小部件中使用 GetxController 的最佳方式
【发布时间】:2021-07-31 23:33:12
【问题描述】:

在我的 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)

有什么不同吗?

非常感谢。

【问题讨论】:

    标签: flutter dart flutter-getx


    【解决方案1】:

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

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

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

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

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

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

    2. 在子小部件中或使用myViewModel = Get.find&lt;MyViewModel&gt;() 的任何其他地方找到您的控制器。您不再需要在孩子中初始化它或在构造函数中传递它。它总能找到适合您的控制器。或者,如果您希望它在 GetBuilder 中使用,您可以在不带任何 init 参数或其他任何东西的孩子中使用 GetBuilder。只需在您的子小部件中写下这个:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-19
      • 1970-01-01
      • 1970-01-01
      • 2015-03-19
      • 2015-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多