【问题标题】:flutter firebase realtime database: how to get the result of orderByValue as a List<String>?颤动的firebase实时数据库:如何将orderByValue的结果作为List<String>?
【发布时间】:2022-01-10 13:20:07
【问题描述】:

我在实时数据库中保留主题标签列表及其外观。

并且我想创建一个服务类,该服务类具有按外观降序检索主题标签作为列表的功能。所以下面是首选结果。

List<String> expHashList = [개발자, 인사담당자, VC, 작가, 경영자];
List<String> topicList = [커리어, 채용, 이직, 리더십, 조직문화];

我在下面尝试过,但它返回空列表([])。

class HashtagService {
  static final HashtagService _instance = HashtagService._internal();
  factory HashtagService() => _instance;

  late final DatabaseReference _database;

  HashtagService._internal() {
    _database = FirebaseDatabase.instance.reference().child('/hashtags');
  }

  List<String> getSuggestion(String type) {
    if (type == 'exp') {
      var query = _database.child('expHash').orderByValue().limitToLast(10);
      return FirebaseList(query: query).cast<String>();
    } else {
      var query = _database.child('topic').orderByValue().limitToLast(10);
      return FirebaseList(query: query).cast<String>();
    }
  }
}

这是第二种方法,但我无法确定类型转换和排序比较功能是否正常工作。而这个版本则返回 Future

  Future<List<String>> getSuggestion() async {
    return await _database.child('expHash').get().then((snapshot) {
      Map<String, int> map = snapshot.value;   // type error -> <dynamic, dynamic>
      List<String> hashtagList = map.keys.toList();   
      hashtagList.sort((k1, k2) => map[k1]! > map[k2]! ? 1 : -1);   // is this right?
      return hashtagList;
    });
  }

将 orderByValue(或 orderByKey 或 orderByChild)结果作为 List 或 List 的最佳方法是什么?


编辑(答案)

List<String?> _resultList = [];

var query = _database.child('topic').orderByValue().limitToLast(10);
query.onChildAdded.listen((Event event) {
    _resultList.add(event.snapshot.key);
});
return await query.get().then((snapshot) {return _resultList;});

但这会返回Future&lt;List&lt;String&gt;&gt;。所以我不得不使用 FutureBuilder 来处理输出。

【问题讨论】:

    标签: flutter firebase-realtime-database


    【解决方案1】:

    在最新版本的 Firebase 的 FlutterFire 库中,您应该能够使用 snapshot.value.values 来获取查询结果快照的有序列表。

    如果这不起作用,以前的方法是 Flutter: Firebase Real-Time database orderByChild has no impact on query resultFlutter Firebase Database wrong timestamp order

    【讨论】:

    • Future getSuggestion(String type) { return _database.child('expHash').orderByValue().limitToLast(10).get(); } var 快照 = 等待 _hashtagService.getSuggestion(widget.type); _suggestionList = snapshot.value.keys.toList();打印(_suggestionList);结果:[작가, 인사담당자, VC, 개발자, 경영자]
    • 我在这些链接中看到了你的 cmets(这就是我尝试 FirebaseList 的原因)但是 event.snapshot.value 返回了字符串?而不是字符串。因此,当我尝试使用 Text() 显示结果时,它返回了错误。
    • 关于评论 #1:如前所述,您需要 snapshot.value.values,而不是 snapshot.value.keys。这是修复它的 PR:github.com/FirebaseExtended/flutterfire/pull/5765/files,例如:github.com/FirebaseExtended/flutterfire/pull/5765/…
    • snapshot.value.values.toList();返回 [2, 3, 2, 5, 0]。我需要标签而不是外观。 (顺便说一句,它们也没有订购)
    猜你喜欢
    • 2018-11-12
    • 2021-06-30
    • 2020-09-15
    • 2021-09-14
    • 2020-12-05
    • 2021-09-26
    • 1970-01-01
    • 2020-11-25
    • 2021-09-17
    相关资源
    最近更新 更多