簡體   English   中英

FutureBuilder 未在 Flutter 中構建異步

[英]FutureBuilder is not building asynchronous in Flutter

我有這個 FutureBuilder,未來會從 firestore 請求布爾值。 但是當我更新值時(hasAccountSetup 變為 true),在我快速重新加載應用程序之前什么都不會發生。

我不知道在這種情況下我是否不應該使用 FutureBuilder,但我的目標是讓應用程序在我將 firebase 數據庫中的 hasAccountSetup 更新為 true 后立即返回 HomePage()。

Future<bool> _getCurrentUserData() async {
  final DocumentSnapshot userDoc = await FirebaseFirestore.instance
      .collection('Users')
      .doc(Auth().currentUser!.uid)
      .get();

  return userDoc.get('HasSetupAccount');
}

class _WidgetTreeState extends State<WidgetTree> {
  @override
  //construtor da class?
  Widget build(BuildContext context) {
    return StreamBuilder(
      stream: Auth().authStateChanges,
      builder: (context, snapshot) {
        if (snapshot.hasData) {
          return FutureBuilder(
              future: _getCurrentUserData(),
              builder: ((context, AsyncSnapshot<bool> hasAccountSetup) {
                if (hasAccountSetup.data == true) {
                  return MyHomePage();
                } else {
                  return AccountSetup();
                }
              }));
        } else {
          return LoginPage();
        }
      },
    );
  }

您正在使用StreamBuilder但 stream 不是stream它是future


看看這個streamBuilder的例子:如果文檔中發生任何變化,您可以在這里直接監聽而無需reload 根據您的要求進行調整。

class _UserInformationState extends State<UserInformation> {
  final _usersStream = FirebaseFirestore.instance
      .collection('Users')  // 👈 Change the collection name according to your need 
      .doc(Auth().currentUser!.uid) // 👈 change the document id according to your need
      .snapshots();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: StreamBuilder<DocumentSnapshot<Map<String, dynamic>>>(
          stream: _usersStream,
          builder:
              (BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) {
            if (snapshot.hasError) {
              return const Text('Something went wrong');
            }
            if (snapshot.connectionState == ConnectionState.waiting) {
              return const Text("Loading");
            }
            Map<String, dynamic> data =
                snapshot.data!.data()! as Map<String, dynamic>;
            return Text(data['fullName']);
          },
        ),
      ),
    );
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM