【问题标题】:How to use where query with arrayContains List in Flutter如何在 Flutter 中使用带有 arrayContains 列表的 where 查询
【发布时间】:2021-06-28 17:15:46
【问题描述】:
Map carsMap = {
    "vehicles": [
      {
        "name": "Vehicle1",
        "models": ["bus", "plane", "bicycle"]
      },
      {
        "name": "Vehicle2",
        "models": ["motorcycle", "sporcar", "plane"]
      },
      {
        "name": "Vehicle3",
        "models": ["motorcycle", "plane", "bicycle"]
      }
    ]
  };

我有如上所示的车辆列表,我想查询并显示哪个列表包括飞机和摩托车。我可以使用此代码单查询哪个列表包括飞机,但我不能同时查询哪个列表包括飞机和摩托车。

List<Map> updatedList = carsList
        .where((m) => m.toString().toLowerCase().contains("plane".toLowerCase()))
        .toList();

顺便说一下,飞机和摩托车只是一个例子,这些数据可以根据用户输入而改变。所以我想根据用户输入动态查询。

我怎样才能通过 where 查询或其他方式来做到这一点。

这是我使用 Firebase 的源代码。

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';

class Home1 extends StatefulWidget {
  @override
  _Home1State createState() => _Home1State();
}

class _Home1State extends State<Home1> {
  final _firestore = FirebaseFirestore.instance;

  @override
  Widget build(BuildContext context) {
    CollectionReference tarifRef = _firestore.collection("vehicles");

    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            StreamBuilder<QuerySnapshot>(
              stream: tarifRef.snapshots(),
              builder: (BuildContext context, AsyncSnapshot asyncsnapshot) {
                if (asyncsnapshot.hasError) {
                  return Center(
                    child: Text("Error"),
                  );
                } else {
                  if (asyncsnapshot.hasData) {
                    List<DocumentSnapshot> listOfDocumentSnapshot =
                        asyncsnapshot.data.docs;
                    return Flexible(
                      child: ListView.builder(
                        itemCount: listOfDocumentSnapshot.length,
                        itemBuilder: (context, index) {
                          return Card(
                            color: Colors.indigo,
                            child: ListTile(
                              title: Text(
                                "${listOfDocumentSnapshot[index]["name"]}",
                                style: TextStyle(
                                  fontSize: 20,
                                  color: Colors.white,
                                ),
                              ),
                              subtitle: Text(
                                "${listOfDocumentSnapshot[index]["vehicleList"]}",
                                style: TextStyle(
                                  fontSize: 15,
                                  color: Colors.white,
                                ),
                              ),
                              trailing: IconButton(
                                icon: Icon(
                                  Icons.delete,
                                  color: Colors.white,
                                ),
                                onPressed: () async {
                                  await listOfDocumentSnapshot[index]
                                      .reference
                                      .delete();
                                },
                              ),
                            ),
                          );
                        },
                      ),
                    );
                  } else {
                    return Center(
                      child: CircularProgressIndicator(),
                    );
                  }
                }
              },
            ),
          ],
        ),
      ),
    );
  }
}

【问题讨论】:

    标签: flutter arraylist


    【解决方案1】:

    您的条件需要一个逻辑或:

      List<Map> updatedList = carsMap['vehicles']
          .where((m) =>  m.toString().toLowerCase().contains("plane".toLowerCase())) || 
    m.toString().toLowerCase().contains("motorcyle".toLowerCase()))
          .toList();
    

    你也可以用这个

      var carsMap = {
        'vehicles': [
          {
            'name': 'Vehicle1',
            'models': ['bus', 'plane', 'bicycle']
          },
          {
            'name': 'Vehicle2',
            'models': ['motorcycle', 'sporcar', 'plane']
          },
          {
            'name': 'Vehicle3',
            'models': ['motorcycle', 'plane', 'bicycle']
          }
        ]
      };
      var n = carsMap['vehicles'].where((element) =>
          (element['models'] as List).contains('plane') ||
          (element['models'] as List).contains('motorcycle'));
    

    如果要动态查询

    在过滤器列表中添加过滤器键并创建一个函数来检查元素是否与过滤器具有共同值

      List filters = [
        'motorcycle',
        'plane'
      ];
      filter(e){
        for(var f in filters)
          if(e['models'].contains(f)) return true;
        return false;
      }
      var n = carsMap['vehicles'].where(filter);
    

    【讨论】:

    • 感谢您的回答,但在此解决方案中,我只能查询飞机和摩托车,或者只能查询 2 个变量。如果用户输入 3 个变量系统查询到 3 个变量,或者用户输入摩托车和公共汽车查询摩托车和公共汽车,我想动态查询
    • 我将我的源代码添加到上面与工作的firebase,你能根据firebase代码给出一个相同的例子吗?
    • @Rkdio 你想在哪里查询?我没看到
    • 本部分开头的CollectionReference tarifRef = _firestore.collection("vehicles");
    猜你喜欢
    • 2021-09-26
    • 2023-01-15
    • 2023-04-11
    • 2021-09-11
    • 2021-06-27
    • 2021-02-17
    • 2021-11-29
    • 2010-12-26
    • 2020-12-18
    相关资源
    最近更新 更多