我正在尋找一種最佳實踐方法來實現在顯示第一頁之前等待我的應用程序初始化數據。
該應用程序有一個主控制器以及每頁一個控制器。主控制器最初從服務器加載數據,在完成之前我想顯示一個啟動頁面(或者至少在打開實際的應用程序頁面之前等待)
一個簡單的解決方案是,頁面等待主控制器初始化
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 準備就緒,然後才能進入路線中描述的頁面?
我嘗試向 GetMaterialApp 添加 WelcomePage,以阻止應用程序直接轉到請求的 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());
}
}
示例(用戶界面):
class HomePage extends GetView<UserController> {
@override
Widget build(BuildContext context) {
// controller from GetView
return controller.obx((state) {
return OtherWidget()
},
onLoading: CircularProgressIndicator(),
)
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句