簡體   English   中英

Flutter FutureBuilder 不會停止顯示 CircularProgressIndicator

[英]Flutter FutureBuilder does not stop showing CircularProgressIndicator

我正在嘗試使用FutureBuilder接收數據,但它掛在 CircularProgressIndicator 上。 我認為它仍保留在ConnectionState.waiting上,但我不確定為什么。


  @override
  initState() {
    _widgetList = getWidgetList();
  }

  Stream<List<String>> getFriendUUIDS() => Firestore.friends
  .doc(gameManager.myself.uuid)
  .snapshots()
  .map((snapshot) => ((snapshot.data()?.keys)?.toList()) ?? []);

  Future<List<MomentWidget>> getWidgetList() async{
    List<MomentWidget> widgetList = [];
    Set<String> momentIds = Set();
    await for (final uuids in getFriendUUIDS()){
      for (String uuid in uuids){
        DocumentSnapshot<Map<String, dynamic>> values =  await Firestore.users
        .doc(uuid)
        .get();
        for (String momentId in values.data()?['moments'] ?? [] ){
          momentIds.add(momentId);
        }
      }
    }

    for (String momentId in momentIds){
      DocumentSnapshot<Map<String, dynamic>> values = 
      await Firestore.instance.collection('moments').doc(momentId).get();
      Map<String, dynamic>? data = values.data()!;
      String downloadURL = await storage.ref('moments/$momentId').getDownloadURL();
      MomentWidget widget = MomentWidget(numLikes: data['liked_by'].length ,
       location: data['location'],
        date: data['timestamp'],
        names: data['taggedFriends'].toString(),
        shotBy: data['taken_by'], image: NetworkImage(downloadURL));
      widgetList.add(widget);
    }
    return widgetList;
  }

  Widget build(BuildContext context) {
    Size size = MediaQuery.of(context).size;
    return Container(
      height: size.height,
      width: size.width,
      child: FutureBuilder(
        future: _widgetList,
        builder: (context, AsyncSnapshot<List<MomentWidget>> snapshot) {
          switch (snapshot.connectionState) {
            case ConnectionState.done:
              if (snapshot.hasError) {
                return Text(snapshot.error.toString());
              } else {
                return ListView.builder(
                    shrinkWrap: true,
                    scrollDirection: Axis.vertical,
                    itemBuilder: (context, pos) {
                      return snapshot.data![pos];
                    },
                  );
              }
            case ConnectionState.waiting:
              return Center(
                child: CircularProgressIndicator(),
              );
            default:
              return Text('Unhandled State');
          }
        }
      ),
      );
  }

我試圖在initState()中獲取Future ,並嘗試使用snapshot.hasData代替,但無濟於事。

我遇到了類似的問題。 從 json 構建 object 時,如果類型不匹配,它可能會悄悄地失敗。 我認為您的 widgetList 不會被退回。 在我的例子中,我有一個變量“cost”,我認為它是 int 類型,但是在數據庫中它是 String 類型。 它總是悄悄地失敗並且從未在 map 小部件上顯示標記

所以:

  1. 檢查您的循環執行了多少次。 可能只有一次然后它悄悄地失敗了

如果出現上述情況:

  1. 確保變量的類型與數據庫中的類型匹配。 將每個變量一一注釋掉,找出問題所在。

讓我知道它是否有效

暫無
暫無

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

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