【问题标题】:How do I search through data in flutter app如何在颤振应用程序中搜索数据
【发布时间】:2026-02-24 09:05:01
【问题描述】:

我是 Flutter 的新手,我正在学习一个展示如何搜索数据的教程。我无法使用我自己的示例重新创建它。我想知道如何从这个 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),
                    );
                  }
                },
              );
            }
          },

【问题讨论】:

    标签: json flutter dart search


    【解决方案1】:

    首先,您的 JSON 文件将根据此答案作为地图返回

    Unhandled Exception: InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'List<dynamic>

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

    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),
                        );
                      }
                    },
                  ),
                ))
              ],
            ),
          ),
        ));
      }
    }
    

    如果我的英语很糟糕,请告诉我,如果你感到困惑,请告诉我

    【讨论】:

    • 我理解你,这很好。谢谢