Flutter:初始化时Getx Controller中的异步功能不起作用

Flutter: Async function in Getx Controller takes no effect when initialized

更新:

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 控制器飞镖文件:

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初始化时被调用。 UI 将在 posts = <Posty>[].obs 更改时更新。伙计们,我在这里做错了什么?

首先,当您在 onInit 上呼叫 readPost 时,您并不是在等待。所以将其更改为:

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

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

而不是 posts.value = reault
  • 从 UI 调用是有效的,因为 readPost 每次 Flutter 框架调用 build 方法时,实际上 UI 显示每次调用的数据.

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

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

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