web-dev-qa-db-ja.com

buildArgumentsなどを使用してFlutter / FirebaseAnimatedListでクエリを実行するにはどうすればよいですか? (例をお願いします)

私はこの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

出来ますか?どうやって?例/チュートリアルはありますか?

ありがとう。

6
abnerh69

私があなたの質問を正しく受け取っている場合、あなたは( "Active" = true)でいくつかのデータをクエリしようとしています、そして次の例を見てください。

私は私のデータベースからスクリーンショットを追加して、私のデータが構造化される方法についてより多くのコンテキストを持ち、うまくいけば、あなたの側で同様の何かを実装するための視点をあなたに与えるでしょう。

enter image description here

前の例では、「[email protected]」に設定された電子メールの連絡先のみを取得し、他の連絡先は無視するために、次のクエリを実行しています。

_ @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("[email protected]").endAt("[email protected]"),
                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()),
                  );
                }
            ),
          ),
        ],
      ),
    );
  }
_

お役に立てば幸いです。

追伸: Chenna Reddy が指摘したように、startAt("[email protected]").endAt("[email protected]")equalTo("[email protected]")に置き換えることができます

startAtendAtは、クエリを特定の範囲に制限する必要がある場合に役立ちます。

詳細については

12
aziza

わかりました、あなたのガイド(@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」による結果のクエリ順序が必要です。したがって、最終ユーザーは「order」順に並べられたデータを見ることができます(ただし、解決を支援するため、「Active」= trueのみ)。

1
abnerh69