Flutter:Getx Controller中的异步函数在初始化时不起作用

Posted

技术标签:

【中文标题】Flutter:Getx Controller中的异步函数在初始化时不起作用【英文标题】:Flutter: Async function in Getx Controller takes no effect when initialized 【发布时间】:2021-06-10 03:51:24 【问题描述】:

更新:

2021/06/11 经过昨天几个小时的调试,我确认问题是由 aws amplify 配置引起的:_configureAmplify()。因为放大服务器的位置设置错误,所以_configureAmplify()需要几秒钟才能工作......因此,readPost()函数在初始化时不起作用,因为它必须在_configureAmplify()之后运行......强>

2021/06/10我根据 S. M. JAHANGIR 的建议更改了我的代码,并更新了问题。问题依然存在。 posts 的值在初始化时调用时不会更新,数据仅在重新加载后显示。 (如果我在 UI 中注释掉 _controller.readPost(),posts 的值总是空的。


我有这个页面,它通过实现 getx 从 aws amplify 加载信息。但是,当控制器实例初始化时,我发现 getx 控制器 dart 文件中的 readPost() async 函数没有从数据库中读取。我必须在 UI 文件中添加一个_controller.readPost() 才能使其工作。并且数据仅在重新加载该 UI 页面后才会显示...

Getx 控制器 dart 文件:

class ReadPostController extends GetxController 
  var isLoading = true.obs;
  var posts = <Posty>[].obs;

  @override
  void onInit() 
    _configureAmplify();
    await readPost();
    super.onInit();
    // print('show post return value: $posts');
  

  void _configureAmplify() 
    final provider = ModelProvider();
    final dataStorePlugin = AmplifyDataStore(modelProvider: provider);
    AmplifyStorageS3 storage = new AmplifyStorageS3();
    AmplifyAuthCognito auth = new AmplifyAuthCognito();
    AmplifyAPI apiRest = AmplifyAPI();

    // Amplify.addPlugin(dataStorePlugin);
    Amplify..addPlugins([dataStorePlugin, storage, auth, apiRest]);
    Amplify.configure(amplifyconfig);
    print('Amplify configured');
      

// read all posts from databases
  Future readPost() async 
    try 
      isLoading(true);
      var result = await Amplify.DataStore.query(Posty.classType);
      print('finish loading request');
      result = result.sublist(1);
      posts.assignAll(result);
      // print(the value of posts is $posts');
     finally 
      isLoading(false);
    
  

  @override
  void onClose() 
    // called just before the Controller is deleted from memory
    super.onClose();
  

在 UI 部分:

class TabBody extends StatelessWidget 
  TabBody(Key? key) : super(key: key);
  final ReadPostController _controller = Get.put(ReadPostController());

  @override
  Widget build(BuildContext context) 
    _controller.readPost();//if commented out, _controller.post is empty
    return Container(
        child: Obx(
      () => Text('showing:$_controller.posts[1].title'),
    ));
  

在我的理解中,readPost() 函数应该在 ReadPost_controller 初始化时调用。当posts = &lt;Posty&gt;[].obs 更改时,UI 将更新。伙计们,我在这里做错了什么?

【问题讨论】:

【参考方案1】:

首先,当您在onInit 上调用readPost 时,您并没有在等待。所以改成:

onInit() async
 ...
 await readPost();
 ... 

其次,posts 是一个 RxList,所以你需要使用assignAll 方法来更新它。 因此,在您的readPost 方法中,您需要使用posts.assignAll(result) 而不是posts.value = reault

从 UI 调用是有效的,因为 readPost 每次由 Flutter 框架调用 build 方法时,实际上 UI 会显示每次调用的数据。

【讨论】:

您好贾汉吉尔,谢谢您的回答。我已根据您的建议更新了我的代码。然而问题依然存在。我已经更新了我的问题。我的猜测是,也许放大返回值太慢了? 你确定await readPost(); 没有被onInit 调用吗? 'finish loading request' 是否在控制台上打印?请告诉我!并且最好在小部件的构建方法上调用final ReadPostController _controller = Get.put(ReadPostController());,而不是直接在类上。 尊敬的贾汉吉尔,感谢您的跟进。经过昨天几个小时的调试,我确认问题是由 aws amplify 配置引起的:_configureAmplify()。因为放大服务器的位置设置错误,所以_configureAmplify()需要几秒钟才能工作……因此,readPost()函数在初始化时不起作用…… 那么现在在正确配置之后,一切正常吗?请确认 您好贾汉吉尔,感谢您的跟进。是的,我写了一个隔离来确保_configureAmplify() 在调用readPost() 之前完成配置,并且它工作正常。感谢您的回答,我认为它对我的调试有所帮助。【参考方案2】:

我想尝试使用 GetBuilder 而不是 Obx。

GetBuilder<ReadPostController>(
builder: (value) => Text('showing:$value.posts[1].title'),
)

并且还使用更新()。在 readPost() 方法中。

【讨论】:

GetBuilder 用于简单的状态管理。不适用于 Rx 你试过这种方式吗?

以上是关于Flutter:Getx Controller中的异步函数在初始化时不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 GetX 订阅另一个 Controller 中的更改?

网页中的 Flutter GetX 路由

对 Flutter 应用程序的 getX dart 包中的 RxList 进行排序

Flutter:如何使用 Getx Obx 更新标记在谷歌地图中的位置?

我在 Getx Flutter 中的 null 值错误中使用了 Null 检查运算符

Getx:通过其他类的obs值触发man类中的obx