当前位置: 首页 > 知识库问答 >
问题:

如何在flutter应用程序中搜索数据

胡高朗
2023-03-14

我是新来的颤振,我正在遵循一个教程,显示如何搜索数据。我不能用我自己的例子来重现。我想知道如何从这个json数据中搜索ListView中的数据。


{

    "success": "true",
    "data": [
        {
            "id": 1,
            "name": "football"
        },
        {
            "id": 2,
            "name": "rugby"
        },
        {
            "id": 3,
            "name": "basketball"
        },
        {
            "id": 4,
            "name": "hockey"
        },
        {
            "id": 5,
            "name": "tennis"
        },
        {
            "id": 6,
            "name": "golf"
        }
    ]

}

使用此代码显示

            if (snapshot.hasData) {
              return ListView.builder(
                itemCount: sports.games.length,
                itemBuilder: (context, index) {
                  if (sports.games.length > 0) {
                    final x = sports.games[index];
                    final y = sports.games[index].id.toString();
                    return ListTile(
                      title: Text(y),
                      subtitle: Text(x.name),
                    );
                  }
                },
              );
            }
          },

共有1个答案

裴韬
2023-03-14

首先,根据下面的回答,JSON文件将作为映射返回

未处理的异常:InternalLinkedHashMap

对于您的问题,以下是解决方案。首先,您需要创建一个这样的模型,可以放在单独的文件中,也可以放在同一个文件中

class Sports {
  int id;
  String name;

  Sports({
    this.id,
    this.name,
  });

  factory Sports.fromJson(Map<String, dynamic> json) {
    return Sports(id: json['id'], name: json['name']);
  }
}

这里是main.dart

import 'package:aberdeen/model.dart';
import 'package:flutter/material.dart';
import 'dart:convert';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  MyApp({Key key}) : super(key: key);

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyApp> {
  TextEditingController controller = new TextEditingController();
  List<Sports> array = [];
  List<Sports> _filtered = [];
  List<Sports> _null_filtered = [];
  String jsonTest =
      '{"success": "true","data": [{"id": 1,"name": "football"},{"id": 2,"name": "rugby"},{"id": 3,"name": "basketball"},{"id": 4,"name": "hockey"},{"id": 5,"name": "tennis"},{"id": 6,"name": "golf"}]}';

  void initState() {
    super.initState();
    test();
  }

  void _alterfilter(String query) {
    List<Sports> dummySearchList = [];
    dummySearchList.addAll(_filtered);
    if (query.isNotEmpty) {
      List<Sports> dummyListData = [];
      dummySearchList.forEach((item) {
        if (item.name.contains(query)) { //if you want to search it order by id you can change item.name.contains to item.id.contains
          dummyListData.add(item);
        }
      });
      setState(() {
        _filtered.clear();
        _filtered.addAll(dummyListData); //dummyListData will place all the data that match at your search bar
      });
      return;
    } else {
      setState(() {
        _filtered.clear();
        _filtered.addAll(_null_filtered); //_null_filtered will place all the data if search bar was empty after enter a words
      });
    }
  }

  Future<Sports> test() async {
    Map<String, dynamic> tagObjsJson = json.decode(jsonTest);
    List<dynamic> data = tagObjsJson["data"];
    setState(() {
      for (Map Data in data) {
        array.add(Sports.fromJson(Data));
      }
      _filtered.addAll(array);
      _null_filtered.addAll(array);
      for (int a = 0; a < _filtered.length; a++) {
        print(_filtered[a].name);
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Row(
              mainAxisAlignment: MainAxisAlignment.spaceAround,
              children: [
                Container(
                  alignment: Alignment.center,
                  child: Container(
                    margin: const EdgeInsets.only(top: 50),
                    width: 300,
                    decoration: BoxDecoration(
                        borderRadius: BorderRadius.circular(20),
                        border: Border.all(
                            width: 1,
                            color: Color.fromRGBO(11, 189, 180, 1),
                            style: BorderStyle.solid)),
                    child: TextField(
                      decoration: InputDecoration(
                          hintText: 'Search your data',
                          contentPadding: EdgeInsets.all(15),
                          border: InputBorder.none),
                      controller: controller,
                      onChanged: (value) {
                        _alterfilter(value);
                      },
                    ),
                  ),
                ),
              ],
            ),
            Expanded(
                child: Container(
              margin: const EdgeInsets.all(20),
              child: ListView.builder(
                scrollDirection: Axis.vertical,
                shrinkWrap: true,
                itemCount: _filtered.length,
                itemBuilder: (context, index) {
                  if (array.length > 0) {
                    final x = _filtered[index];
                    final y = _filtered[index].id.toString();
                    return ListTile(
                      title: Text(y),
                      subtitle: Text(x.name),
                    );
                  }
                },
              ),
            ))
          ],
        ),
      ),
    ));
  }
}

对不起,如果我的英语很差,但是如果你感到困惑,请告诉我

 类似资料:
  • 问题内容: 我在徘徊自己是哪个组件最适合显示swing中的快速搜索结果。我想创建类似这样的内容,在用户可以输入文本的地方创建一个文本字段,在输入过程中,我将改善对数据库的后端快速搜索,并且希望在文本框下方显示数据,他将能够浏览结果,然后按输入将在表中显示结果。所以我的问题是,是否有任何组件已经具有此显示逻辑?还是不是,实现它的最佳方法是什么。 如果可以在桌面应用程序上进行,此搜索将是ajax在网络

  • 问题内容: 我看到了有关搜索引擎和SEO的AngularJS应用程序两个问题: 1)自定义标签会怎样?搜索引擎会忽略这些标签中的全部内容吗?即假设我有 尽管位于自定义标签中仍会被索引? 2)有没有一种方法可以避免搜索引擎将{{}}编入索引的字面绑定?即 我知道我可以做类似的事情 但是,如果我想让搜寻器“看到”标题怎么办?服务器端渲染是唯一的解决方案吗? 问题答案: 2014年5月更新 Google

  • 有没有办法从Firebase检索数据到一个Java应用程序? 我有一个Android应用程序,它将数据存储到一个Firebase数据库中,我需要在一个Java应用程序中读取这些数据。我在网上查了一下,但没有找到一个明确的答案。 //不是浏览器的URL,而是数据库上方的URL //这里我尝试引用数据库并在其中放入一个值

  • 问题内容: 我在netbeans中创建了jtable,并在jtable中填充了数据库中的数据,但是我无法使用jtextfield在jtable中实现搜索选项。谁能指导我。谢谢 问题答案: 为了在表上搜索内容,必须将原始内容存储在某个变量中。在下面的示例中,我将表模型的初始值存储在向量中。 下面有两种实现方式:一种是在文本字段上键入内容后立即进行搜索,另一种则仅在单击按钮后进行搜索。 对于第一个,您

  • 问题内容: 如何使用preg_match在数组中搜索? 例: 问题答案: 在这篇文章中,我将为您提供三种不同的方法来满足您的要求。 我实际上建议使用最后一个代码段,因为它最容易理解并且代码简洁。 如何查看数组中与我的正则表达式匹配的元素? 有专门用于此目的的功能。它将一个正则表达式作为第一个参数,并将一个数组作为第二个参数。 请参见以下示例: 输出 但是我只想获取指定组的值。怎么样? 与能解决清洁

  • 重要的一点在这里: 当我运行这行(从VS代码运行iPhone模拟器)时,控制台上没有任何消息,调试会话结束,模拟器屏幕变为黑色,几秒钟后返回主屏幕。 我对所有这些都是新手,但我唯一的想法是:当我在控制台上打印时,我得到的是 闭包:({String phoneNumber,Duration timeout,int forceResendingToken,(AuthCredential)=>void