Просмотр списка фильтров Flutter — json

#flutter #dart

#флаттер #dart

Вопрос:

я новичок в flutter, у меня есть локальный файл json, как показано ниже, мне удалось отобразить его в моем пользовательском интерфейсе, а также отобразить панель фильтра / поиска, но теперь я пытаюсь создать функцию filter listview. Я попробовал несколько вещей, но у меня ничего не вышло. Как мне сравнить пользовательский ввод с данными в моем файле JSON? Мне было интересно, как заставить функцию поиска работать по «имени»?

 {
    "name": "Telekinesis",
    "description": "Rubick uses his telekinetic powers to lift the enemy into the air briefly and then hurls them back at the ground.",
    "logo_url": "http://static.wikia.nocookie.net/dota2_gamepedia/images/0/0e/Telekinesis_icon.png"
  },
  

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

class MyApp extends StatelessWidget {
  // This widget is the root of your application.

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Header'),
      debugShowCheckedModeBanner: false,
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

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

class _MyHomePageState extends State<MyHomePage> {
  TextEditingController controller = new TextEditingController();

  
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Center(child: Text(widget.title)),
      ),
      body: Container(
        child: Column(
          children: <Widget>[
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: TextField(
                decoration: InputDecoration(
                    hintText: "Search Title",
                    border: OutlineInputBorder(
                        borderSide:
                            BorderSide(color: Theme.of(context).primaryColor))),
              ),
            ),
            Expanded(
              child: FutureBuilder(
                future: DefaultAssetBundle.of(context)
                    .loadString('components/abilities-list.json'),
                builder: (context, snapshot) {
                  var myData = jsonDecode(snapshot.data.toString());
                  return ListView.builder(
                    itemBuilder: (BuildContext context, index) {
                      return ListTile(
                          leading: CircleAvatar(
                              backgroundImage:
                                  NetworkImage(myData[index]['logo_url'])),
                          title: Text('Name: '   myData[index]['name']),
                          subtitle: Text(
                            'Description: '   myData[index]['description'],
                          ));
                    },
                    itemCount: myData == null ? 0 : myData.length,
                  );
                },
              ),
            ),
          ],
        ),
      ),
    );
  }
}
  

Ответ №1:

com/users/14288499/muhammad-medani создает класс данных, подобный

 class JSONData {
  String name;
  String description;
  String logoUrl;

  JSONData({this.name, this.description, this.logoUrl});

  JSONData.fromJson(Map<String, dynamic> json) {
    name = json['name'];
    description = json['description'];
    logoUrl = json['logo_url'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['name'] = this.name;
    data['description'] = this.description;
    data['logo_url'] = this.logoUrl;
    return data;
  }
}
  

когда вы получите данные из будущего конструктора, передайте этот снимок.данные в метод FromJSON, чтобы вы получили его объекты, а затем также могли выполнять поиск.
создайте List<JSONData> data= []; подобный этому, а затем вы сможете получить к нему доступ в listview builder и выполнить поиск также следующим образом

 data.forEach((userDetail) {
      if (data.name.contains(text) || data.name.contains(text))
        _searchResult.add(userDetail);
    });