如何使用 buildArguments 或其他任何东西在 Flutter/FirebaseAnimatedList 中查询? (请举例)

Posted

技术标签:

【中文标题】如何使用 buildArguments 或其他任何东西在 Flutter/FirebaseAnimatedList 中查询? (请举例)【英文标题】:How to query in a Flutter/FirebaseAnimatedList using buildArguments or anything else? (example please) 【发布时间】:2018-04-05 09:07:24 【问题描述】:

我有一个带有正文的Scaffold

body: new Column(
        children: <Widget>[
          new Flexible(
            child: new FirebaseAnimatedList(
              query: FirebaseDatabase.instance
                  .reference()
                  .child('products')
                  .orderByChild('order'),
              padding: new EdgeInsets.all(8.0),
              reverse: false,
              itemBuilder: (_, DataSnapshot snapshot,
                  Animation<double> animation, int x) 
                return new ProductItem(
                    snapshot: snapshot, animation: animation);
              ,
            ),
          ),
        ],
      ),

但我需要添加一个简单的查询:'Active' = true

有可能吗?如何?任何示例/教程?

谢谢。

【问题讨论】:

由于您想通过“活动”字段进行查询,根据您存储活动字段的方式,您的查询应该类似于FirebaseDatabase.instance .reference().child('active').equalTo(true)FirebaseDatabase.instance .reference().child('active').equalTo('true')。我可以知道使用 orderByChild('order') 的动机是什么吗?为什么是查询的一部分? @ChennaReddy,我需要按“订单”生成的查询顺序,这是一个整数字段(或属性),一些管理员用户可以更改(更新)。所以最终用户可以看到按“顺序”排序的数据(但只有 'Active'=true,因为你帮我解决了)。 【参考方案1】:

好的,按照您的指南(@ChennaReddy 和 @aziza),这是我修复代码的方式:

body: new Column(
        children: <Widget>[
          new Flexible(
            child: new FirebaseAnimatedList(
              query: FirebaseDatabase.instance
                  .reference()
                  .child('products')
                  .orderByChild('Active')           // line changed
                  .equalTo(true),                   // line added
              padding: new EdgeInsets.all(8.0),
              reverse: false,
              itemBuilder: (_, DataSnapshot snapshot,
                  Animation<double> animation, int x) 
                return new ProductItem(
                    snapshot: snapshot, animation: animation);
              ,
            ),
          ),
        ],
      ),

但是,我需要按“order”生成的查询顺序,它是一些管理员用户可以更改(更新)的整数字段(或属性)。所以最终用户可以看到按“顺序”排序的数据(但只有“活动”=true,因为你帮我解决了)。

【讨论】:

感谢您的回答。我面临类似的情况,您的回答有所帮助,但提出了另一个问题。我怎样才能让它随着列表滚动,而不是坐在顶部的静态小部件?【参考方案2】:

如果我没有正确回答您的问题,您正在尝试查询一些数据 where ("Active" = true),请参阅以下示例。

我从我的数据库中添加了一个屏幕截图,以便对我的数据的结构方式有更多的背景信息,希望它能让您了解最终实现类似的东西。

在前面的示例中,我正在执行以下查询以仅获取设置为“em1@gmail.com”的电子邮件的联系人,而忽略其他。

 @override
  Widget build(BuildContext context) 
    return new Scaffold(
      appBar: new AppBar(title: new Text("Firebase Example"),),
      body: new Column(
        children: <Widget>[
          new Flexible(
            child: new FirebaseAnimatedList(
                query: FirebaseDatabase.instance
                    .reference().child("contacts")
                    .orderByChild("email")
                    .startAt("em1@gmail.com").endAt("em1@gmail.com"),
                padding: new EdgeInsets.all(8.0),
                reverse: false,
                itemBuilder: (_, DataSnapshot snapshot,
                    Animation<double> animation, int x) 
                  return new ListTile(
                    subtitle: new Text(snapshot.value.toString()),
                  );
                
            ),
          ),
        ],
      ),
    );
  

希望对您有所帮助。

P.S:正如Chenna Reddy 指出的,您可以将startAt("em1@gmail.com").endAt("em1@gmail.com") 替换为equalTo("em1@gmail.com")

startAtendAt 在您需要将查询限制在特定范围内时很有用。

For more information.

【讨论】:

为什么不使用equalTo 而不是startAtendAt 的组合? 这是我最初设置查询的方式,equalTo 肯定会得到相同的结果。

以上是关于如何使用 buildArguments 或其他任何东西在 Flutter/FirebaseAnimatedList 中查询? (请举例)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 fiddler 或任何其他工具跟踪 HttpClient 请求?

如何使用 ProGuard(或任何其他方式)隐藏库 Jar 中的公共类?

如何在没有任何 IDE 或 GlassFish 等任何其他附加软件的情况下安装和使用 JEE [重复]

如何使用 Cloudkit 将字典(或任何其他复杂结构)保存到 iCloud 中?

如何在 WebStorm 或任何其他 JetBrains 产品中使用 WSL 作为默认终端?

如何使用 Visual Studio 或 Resharper(或任何其他工具!)将 HTML 正确粘贴到 C# 代码中?