簡體   English   中英

無法查詢到Firebase的數據

[英]Unable to query data from Firebase

我正在嘗試從 Firebase 檢索數據。這是我的代碼片段

Future main() async {

  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();

  // DatabaseReference ref = FirebaseDatabase.instance.ref();
  runApp(const MyApp());
}
class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    final docRef = FirebaseFirestore.instance.collection('data').doc("rules");
    docRef.get().then(
          (DocumentSnapshot doc) {
        final data = doc.data() as Map<String, dynamic>;
        return MyHomePage(title: 'ARNET Helper',
            rules: data['ruleslist']);
      },
      onError: (e) => print("Error getting document: $e"),
    );
    return Spinner(text: "Unable to retrieve data");
  }

}  

下面是對應的Firebase數據庫截圖在此處輸入圖像描述

我確實將 google-services.json 添加到 android/app 文件夾中。 但是對於上面的代碼片段,“then”塊中的行似乎沒有被擊中並且微調器(即 return Spinner(text: "Unable to retrieve data");)總是被返回。

我確實將這些行添加到 AndroidManifest.xml

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET"/>

我試着調試它。 但是第 46 行的斷點從未被擊中。 相反,執行直接進入第 52 行。我錯過了什么? 在此處輸入圖像描述

我什至嘗試過按照一位評論者的建議使用 FutureBuilder。 我總是得到“出了點問題..”微調器

  @override
  Widget build(BuildContext context) {
    CollectionReference data = FirebaseFirestore.instance.collection('data');
    return FutureBuilder<DocumentSnapshot>(
      future:  data.doc('rules').get(),
      builder:
          (BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) {

        if (snapshot.hasError) {
          return Spinner(text: 'Something went wrong...');
        }

        if (snapshot.hasData && !snapshot.data!.exists) {
          return Spinner(text: 'Document does not exist...');
        }


        if (snapshot.connectionState == ConnectionState.done) {
          Map<String, dynamic> data = snapshot.data! as Map<String, dynamic>;

          return MyHomePage(title: 'ARNET Helper', rules: data['ruleslist'].entries.toList() as List<dynamic>);
        }

        return Spinner(text: 'Loading...');
      },
    );
  }
}

問題是get()是一個異步操作,你不能在build中異步返回小部件。

解決此問題的最簡單方法是使用FutureBuilder

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  return FutureBuilder<String>(
    future: FirebaseFirestore.instance.collection('data').doc("rules").get(),
    builder: (BuildContext context, AsyncSnapshot<DocumentSnapshot> asyncSnapshot) {
      if (snapshot.hasData) {
        final data = asyncSnapshot.data!.data() as Map<String, dynamic>;
        return MyHomePage(title: 'ARNET Helper', rules: data['ruleslist']);
      }
      else if (snapshot.hasError) {
        return Text("Error: ${snapshot.error}")
      } 
      else {
        return Text("Loading user data...")
      }    
    }    
  )
}  

您是否初始化了 Firebase 實例?

await Firebase.initializeApp()

不確定是什么問題,但下面的配置有效。

pubspec.yaml

  firebase_core: ^1.24.0
  cloud_firestore: ^3.5.0

FutureBuilder 查詢

@override
  Widget build(BuildContext context) {
    CollectionReference data = FirebaseFirestore.instance.collection('data');
    return FutureBuilder<DocumentSnapshot>(
      future:  data.doc("rules").get(),
      builder:
          (BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) {

        if (snapshot.hasError) {
          return Spinner(text: 'Something went wrong...');
        }

        if (snapshot.hasData && !snapshot.data!.exists) {
          return Spinner(text: 'Document does not exist...');
        }


        if (snapshot.connectionState == ConnectionState.done) {
          final data = snapshot.data!.get('ruleslist') ;

          return MyHomePage(title: 'ARNET Helper', rules: data);
        }

        return Spinner(text: 'Loading...');
      },
    );
  }
}

暫無
暫無

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

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