【问题标题】:get all user name from all documents in Firestore flutter从 Firestore Flutter 中的所有文档中获取所有用户名
【发布时间】:2022-01-14 23:06:19
【问题描述】:

长话短说,我需要获取所有待办事项的列表

,但现在我只有一个列表,我该如何返回这个列表? <p>获取一个流<list></list></p> <pre><code> static Stream<List<Todo>> readTodos() => FirebaseFirestore.instance .collection('todo') .orderBy(TodoField.createdTime, descending: true) .snapshots() .transform(Utils.transformer(Todo.fromJson)); </code></pre> <p>然后使用 StreamBuilder 我可以获得一个列表,但是对于一个方法我只需要这些 todos 的所有名称,所以我希望它最终看起来像这样:</p> <pre><code>todoTitle: [ 'eat', 'drink', 'run', ] </code></pre> <p>那我能做什么?非常感谢!</p> <p><strong>更新</strong> 我不知道以下是否是一个解决方案,但它还不起作用:</p> <pre><code>final provider = Provider.of<TodosProvider>(context); final todos = provider.todos; List<String> userTitle = todos.map['Todo'].where((todo) => todo['title'] != null).map((value) => value['title']).toList(); </code></pre> <p>然后我从 map['Todo'] 得到一个错误,错误是 (<code>The operator '[]' isn't defined for the type 'Iterable&lt;T&gt; Function&lt;T&gt;(T Function(Todo))'.</code>),请帮助 T T 谢谢!</p> <p><a href="/default/index/tourl?u=aHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS95anhWMS5wbmc%3D" rel="nofollow" target="_blank"></a></p>

【问题讨论】:

  • 这里真的很难说没有看到minimal code that reproduces the problem,可能还有你正在使用的文档结构的截图。
  • 嗨弗兰克,很高兴再次见到你,我更新了我的问题,对不起,我在德国,现在在深夜我无法清晰地思考..

标签: flutter google-cloud-firestore


【解决方案1】:

有两种解决方案(感谢弗兰克从另一个堆栈的回复):

一个。创建另一个只包含标题的集合,然后轻松获取 List

。 <p>b.获取所有数据作为当前解决方案,我使用 forEach 将值分隔到一个列表中(我仍然不知道如何在 map() 中执行此操作,如果有人有任何想法,请帮助我):</p> <ol> <li> <p>创建列表<string> 获取所有标题</string></p> <p><code>List&lt; String &gt; titles = [];</code></p> </li> <li> <p>获取List<todos>如上以StreamBuilder的方式展示,然后通过provider获取所有List</todos></p> </li> </ol> <pre><code>final provider = Provider.of<TodosProvider>(context); final todos = provider.todos; </code></pre> <ol> <li>用户 forEach 将 <code>todo.title</code> 放入 <code>List&lt; String &gt; titles</code> </li> </ol> <pre><code>getAllTitles(todos){ todos.forEach((todo) { titles.add(todo.title); }); } </code></pre> <p>我相信有一种像 h8moss 向我展示的聪明方法,可以创建另一个 Stream<list> todoTitles,但是我需要听另一个流,我是 Firestore 和 Flutter 世界的新手,我不知道哪个更好或如何以正确的方式执行 Stream<list>.. 我只是把我的解决方案放在这里以防我将来忘记。</list></list></p>

【讨论】:

    【解决方案2】:

    如果您想要获取Todo 类的某些部分(在本例中为title),您可以使用Stream.map 方法:

        static Stream<List<String>> readTodoTitles() => FirebaseFirestore.instance
          .collection('todo')
          .orderBy(TodoField.createdTime, descending: true)
          .snapshots()
          .transform(Utils.transformer(Todo.fromJson))
          .map<String>((list) => 
            list.map((element) => element.title,
          ).toList());
    

    【讨论】:

    • 您好 h8moss,非常感谢您的帮助,但我按照您的回答并收到错误,很抱歉耽误您的时间,但您能告诉我我需要做什么吗?这是错误(无法从方法“readTodoTitles”返回“Stream”类型的值,因为它的返回类型为“Stream>”)
    • 如果我像这样更新你的答案 ( static Stream readTodoTitles() => FirebaseFirestore.instance .collection('todo') .orderBy(TodoField.createdTime, descending: true) .snapshots () .transform(Utils.transformer(Todo.fromJson)) .map((element) => element.title);) 我会从 element.title 得到一个错误(getter 'title' 没有定义对于类型 'List')
    • @mattipeterbull 我明白了......我不知道如何解决这个问题,因为我的信息很少,不过,我已经用一个可能的新解决方案更新了我的答案,你介意看看是吗?
    • 嗨 h8moss,非常感谢您的帮助,并为我迟到的回复感到抱歉,我必须在白天工作....仍然有错误('Stream' 类型的值无法从方法“readTodoTitles”返回,因为它的返回类型为“Stream>”。(文档)返回类型“List”不是“String”,按要求由闭包的上下文。),所以经过几次尝试,我想我解决了我的问题......希望它是正确的,请查看我的更新答案
    • 只要有效,你的答案应该是正确的!问题本身很复杂,也许在这里使用.map 并不是正确的方法。很高兴您能找到满意的答案
    猜你喜欢
    • 2021-07-29
    • 2021-07-25
    • 2020-02-24
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    相关资源
    最近更新 更多