Flutter и Getx: как передать параметры из пользовательского интерфейса в контроллер 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);
    }
  }
}

Но проблема, с которой я сейчас сталкиваюсь, заключается в следующем: чтобы прочитать конкретное сообщение из базы данных, мне нужен параметр postID. И, как вы понимаете, этот параметр можно записать, когда я нажимаю конкретную публикацию в пользовательском интерфейсе, но как передать этот параметр этому контроллеру Getx? А может я все делаю неправильно?


person BigPP    schedule 08.06.2021    source источник


Ответы (1)


Вы можете использовать экземпляр вашего контроллера в пользовательском интерфейсе.

Например, в виджете вы вызываете контроллер:

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

//and when you need to change you do like this:
_controller.updateID(newId);

Внутри метода updateID вы можете вызвать метод загрузки:

updateID(var postID) {
  postid.value = postID;
  print('im print ${postid.value}');
  readPost(postID);
}
person Jorge Vieira    schedule 08.06.2021
comment
Спасибо за ответ! Оно работает! У меня есть еще один быстрый вопрос. В своем ответе вы используете _controller.update(newId). Раньше я использовал GetX<ReadSinglePostController>( builder: (controller) { в дереве виджетов. Эти два метода разные? и как? - person BigPP; 08.06.2021
comment
Итак, в Getx есть 3 типа управления состоянием: Gex, Obx и GetBuilder, вы можете выбрать, какой из них лучше подходит для ваших нужд. Я всегда использовал Obx, потому что думаю проще и понятнее. И мне легче слышать изменения состояний на виджете. Подробнее о различиях можно прочитать здесь: github.com/jonataslaw/getx/blob/master/documentation/en_US/ - person Jorge Vieira; 08.06.2021