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 = <Posty>[].obs
更改时,UI 将更新。伙计们,我在这里做错了什么?
【问题讨论】:
【参考方案1】:首先,当您在onInit
上调用readPost
时,您并没有在等待。所以改成:
onInit() async
...
await readPost();
...
其次,posts
是一个 RxList,所以你需要使用assignAll
方法来更新它。
因此,在您的readPost
方法中,您需要使用posts.assignAll(result)
而不是posts.value = reault
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 dart 包中的 RxList 进行排序
Flutter:如何使用 Getx Obx 更新标记在谷歌地图中的位置?