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() 方法中。
更新:
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() 方法中。