【发布时间】: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<List<String>>。所以我不得不使用 FutureBuilder 来处理输出。
【问题讨论】:
标签: flutter firebase-realtime-database