Flutter:使用带有http请求的Firebase实时数据库实现分页

时间:2020-08-26 13:39:26

标签: flutter dart firebase-realtime-database httprequest

如何在Flutter中使用HTTP请求在实时数据库中实现分页?我尝试了以下操作,但返回了错误。

  Future<List<News>> fetchNews() async {
    final response = await http.get("https://<project-id>.firebaseio.com/posts.json?orderBy='t'&limitToFirst=10");
    Map map = json.decode(response.body);
    map.forEach((NewsId, NewsData) {
      _list.add(News.fromJson(NewsData));
    });
    return _list;
  }

返回的错误是:

I/flutter (18683): {
I/flutter (18683):   "error" : "orderBy must be a valid JSON encoded path"
I/flutter (18683): }

我试图用以下内容替换网址:https://project-id.firebaseio.com/posts.json?orderBy=(backslash)"t(backslash)"&limitToFirst=10 但是我收到的错误是:

I/flutter (18683): {
I/flutter (18683):   "error" : "Index not defined, add \".indexOn\": \"t\", for path \"/posts\", to the rules"
I/flutter (18683): }

任何有关如何实现分页的帮助都会有所帮助。我也不介意使用包而不是使用http请求。如果这两种方法之间有任何显着差异,我将不胜感激。

我的数据库结构如下:

<project-id>
|__posts
     |____(unique key1)
               |_____field1
               |_____field2
               |_____field3
     |____(unique key2)
     |____(unique key3)

谢谢。

1 个答案:

答案 0 :(得分:0)

您快到了。第一个错误是因为要订购的属性名称必须是带双引号的字符串。单引号是不可接受的,因此转义"的方式确实是正确的。

新错误是因为您需要在数据库的安全规则中定义一个索引,以便服务器知道要对数据库进行排序/筛选的内容。如果您查看indexing data上的文档并从错误消息中获取信息,则会变成:

{
  "rules": {
    "posts": {
      ".indexOn": "t"
    }
  }
}

顺便说一句:我通常首先在浏览器中使用我的REST查询,然后才在我的代码中复制它们。这样,您就可以知道错误是来自Firebase还是来自Flutter代码中的调用方式。