flutter firebase 实时数据库:如何将 orderByValue 的结果作为 List<String> 获取?

flutter firebase realtime database: how to get the result of orderByValue as a List<String>?

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

我想制作一项服务 class,它具有按出现的降序检索主题标签作为列表的功能。所以下面是首选结果。

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

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

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>();
    }
  }
}

这是第二种方法,但我无法确定类型转换和排序比较功能是否正常工作。而这个版本 returns 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<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;});

但是这个returns Future<List<String>>代替了。所以我不得不使用 FutureBuilder 来处理输出。

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

如果这不起作用,以前的方法是 or