【发布时间】:2022-01-10 13:42:17
【问题描述】:
这是我尝试使用 Flutter GetX 包实现的,但无法正常工作。
我有一个 Firestore 文档,如果文档发生更改,我想调用一个 api 并将数据保持为可观察到的最新状态。
下面的代码似乎可以工作,但初始屏幕显示空错误,然后显示数据。
我不知道如何确保 fetchFirestoreUser() 和 fetchApiData()(异步方法)在我移至主屏幕之前返回数据。
GetX StateMixin 似乎有助于解决异步数据加载问题,但我不知道如何在 firestore 文档更改时刷新 api 数据。
我不确定是否有任何其他状态管理最适合我的方案,但与其他状态管理包相比,我发现 GetX 更容易。
如果有人能告诉我如何解决这个问题,我将不胜感激,非常感谢。
身份验证控制器。
class AuthController extends SuperController {
static AuthController instance = Get.find();
late Rx<User?> _user;
FirebaseAuth auth = FirebaseAuth.instance;
var _firestoreUser = FirestoreUser().obs;
var _apiData = ProfileUser().obs;
@override
void onReady() async {
super.onReady();
_user = Rx<User?>(auth.currentUser);
_user.bindStream(auth.userChanges());
//get firestore document
fetchFirestoreUser();
//fetch data from api
fetchApiData();
ever(_user, _initialScreen);
//Refresh api data if firestore document has changed.
_firestoreUser.listen((val) {
fetchApiData();
});
}
Rx<FirestoreUser?> get firestoreUser => _firestoreUser;
_initialScreen(User? user) {
if (user == null) {
Get.offAll(() => Login());
} else {
Get.offAll(() => Home());
}
}
ProfileUser get apiData => _apiData.value;
void fetchFirestoreUser() async {
Stream<FirestoreUser> firestoreUser =
FirestoreDB().getFirestoreUser(_user.value!.uid);
_firestoreUser.bindStream(firestoreUser);
}
fetchApiData() async {
var result = await RemoteService.getProfile(_user.value!.uid);
if (result != null) {
_apiData.value = result;
}
}
@override
void onDetached() {}
@override
void onInactive() {}
@override
void onPaused() {}
@override
void onResumed() {
fetchApiData();
}
}
主屏幕
class Home extends StatelessWidget {
const Home({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Container(
child: Obx(() =>
Text("username: " + AuthController.instance.apiData.username!))),
),
);
}
}
【问题讨论】:
-
基本上,当您最初访问您的页面时,它会显示错误,然后将数据正确放置?
-
正确,最初为空错误
标签: flutter google-cloud-firestore state-management flutter-getx flutter-packages