Flutter 和 Getx:如何将参数从 UI 传递到 Getx 控制器?

Big*_*gPP 8 flutter flutter-getx

我有这个 Getx 控制器用于从数据库读取帖子的内容:

class ReadSinglePostController extends GetxController {
  var isLoading = true.obs;
  var posts = Post(
          postID: 1,
          userID: 0,
          thumbnail: 'thumbnail',
          imageList: 'imageList',
          title: 'title',
          description: 'description',
          createdTime: DateTime.now())
      .obs; //yes this can be accessed

  var postid = 2.obs; //I want this value to change when I click a post in the UI

  @override
  void onInit() {
    super.onInit();
    readPost(postid);
  }

  updateID(var postID) {
    postid.value = postID;
    print('im print ${postid.value}');
  }//should update postid when a post is clicked in the UI

  Future readPost(var postID) async {
    try {
      isLoading(true);
      var result = await PostsDatabase.instance.readPost(postID);
      posts.value = result;
    } finally {
      isLoading(false);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但我现在面临的问题是:要从数据库读取特定的帖子,我需要参数postID。正如您可以想象的那样,当我在 UI 中单击特定的帖子时可以记录此参数,但是如何将该参数传递给此 Getx 控制器呢?或者也许我做错了整件事?

Jor*_*ira 9

您可以在 Ui 上使用控制器的实例。

例如,在小部件上您调用控制器:

final ReadSinglePostController _controller = Get.put(ReadSinglePostController());

//and when you need to change you do like this:
_controller.updateID(newId);
Run Code Online (Sandbox Code Playgroud)

在 updateID 方法中,您可以调用 load 方法:

updateID(var postID) {
  postid.value = postID;
  print('im print ${postid.value}');
  readPost(postID);
}
Run Code Online (Sandbox Code Playgroud)

  • 所以 Getx 上有 3 种状态管理类型:Gex、Obx 和 GetBuilder,您可以选择更适合您需求的一种。我一直使用 Obx 因为我认为更简单、更清晰。而且我也觉得更容易听到小部件上的状态变化。您可以在此处阅读有关差异的更多信息:https://github.com/jonataslaw/getx/blob/master/documentation/en_US/state_management.md#getbuilder-vs-getx-vs-obx-vs-mixinbuilder (3认同)