如何使用 GetX 使 Flutter 等待数据加载
How to make Flutter with GetX wait until data is loaded
我正在寻找一种最佳实践方法来实现在显示第一页之前等待我的应用程序初始化数据。
该应用程序有一个主控制器以及每页一个控制器。主控制器最初从服务器加载数据,在完成之前我想显示一个启动页面(或者至少在打开实际应用程序页面之前等待)
一个简单的解决方案是,页面等待主控制器初始化
class MainController extends GetxController {
final isInitialized = false.obs;
@override
void onInit() async {
Future f1 = server.get('service1').then(....)
Future f2 = server.get('service1').then(....)
Future f3 = server.get('service1').then(....)
await Future.wait([f1, f2, f3]);
isInitialized.value = true;
}
}
页面组件可以:
class HandleTaskPage extends GetView<HandleTaskPageController> {
@override
Widget build(BuildContext context) {
MainController mainController = Get.find();
return Obx(() {
if (mainController.isInitialized().value) {
return TaskPanelWidget();
} else {
return WaitingPage();
}
})
}
}
但我的应用程序允许用户使用直接 url(网络应用程序)从任何给定页面开始,例如http://app.com/showtask/123
这意味着我必须在每个页面上等待全局控制器。
有什么方法可以简单地让 Get 等待(并可能显示欢迎页面)直到 GlobalController 准备就绪,然后再转到路由中描述的页面?
我已尝试将 WelcomePage 添加到 GetMaterialApp,以阻止该应用直接转到所请求的 url。 WelcomeController 应该在重定向之前等待 MainController。但即使欢迎页面确实得到呈现,应用程序仍会自动继续到 url.
中请求的页面
void main() {
runApp(GetMaterialApp(
home: WelcomePage(),
...
...
...
您可以使用名称 StateMixin.
实现 mixin
示例(控制器):
class UserController extends GetxController with StateMixin {
getData() {
// make status to loading
change(null, status: RxStatus.loading());
// Code to get data
await service.getData()
// if done, change status to success
change(null, status: RxStatus.success());
}
}
示例 (UI):
class HomePage extends GetView<UserController> {
@override
Widget build(BuildContext context) {
// controller from GetView
return controller.obx((state) {
return OtherWidget()
},
onLoading: CircularProgressIndicator(),
)
}
}
我正在寻找一种最佳实践方法来实现在显示第一页之前等待我的应用程序初始化数据。
该应用程序有一个主控制器以及每页一个控制器。主控制器最初从服务器加载数据,在完成之前我想显示一个启动页面(或者至少在打开实际应用程序页面之前等待)
一个简单的解决方案是,页面等待主控制器初始化
class MainController extends GetxController {
final isInitialized = false.obs;
@override
void onInit() async {
Future f1 = server.get('service1').then(....)
Future f2 = server.get('service1').then(....)
Future f3 = server.get('service1').then(....)
await Future.wait([f1, f2, f3]);
isInitialized.value = true;
}
}
页面组件可以:
class HandleTaskPage extends GetView<HandleTaskPageController> {
@override
Widget build(BuildContext context) {
MainController mainController = Get.find();
return Obx(() {
if (mainController.isInitialized().value) {
return TaskPanelWidget();
} else {
return WaitingPage();
}
})
}
}
但我的应用程序允许用户使用直接 url(网络应用程序)从任何给定页面开始,例如http://app.com/showtask/123 这意味着我必须在每个页面上等待全局控制器。
有什么方法可以简单地让 Get 等待(并可能显示欢迎页面)直到 GlobalController 准备就绪,然后再转到路由中描述的页面?
我已尝试将 WelcomePage 添加到 GetMaterialApp,以阻止该应用直接转到所请求的 url。 WelcomeController 应该在重定向之前等待 MainController。但即使欢迎页面确实得到呈现,应用程序仍会自动继续到 url.
中请求的页面void main() {
runApp(GetMaterialApp(
home: WelcomePage(),
...
...
...
您可以使用名称 StateMixin.
实现 mixin示例(控制器):
class UserController extends GetxController with StateMixin {
getData() {
// make status to loading
change(null, status: RxStatus.loading());
// Code to get data
await service.getData()
// if done, change status to success
change(null, status: RxStatus.success());
}
}
示例 (UI):
class HomePage extends GetView<UserController> {
@override
Widget build(BuildContext context) {
// controller from GetView
return controller.obx((state) {
return OtherWidget()
},
onLoading: CircularProgressIndicator(),
)
}
}