微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

返回页面时,带有过滤器搜索页面的 Flutter 不断从查询中添加相同的列表视图

如何解决返回页面时,带有过滤器搜索页面的 Flutter 不断从查询中添加相同的列表视图

我最近关注了这个答案:Listview filter search in Flutter 关于如何使用搜索过滤器实现 Flutter Listview。过滤器按照答案中的说明工作。每次我离开那个特定页面然后回到它时都会出现问题,然后我在列表视图中的结果翻了一番。当我再次离开页面,然后再次返回时,它已经翻了三倍,以此类推。

我知道我应该在离开列表视图页面时在某处清除列表,不知道你在哪里。在我遵循的示例中的代码下方。我的 MysqL 查询很简单。 SELECT * FROM table_name。

import 'dart:async';

import 'package:Flutter/material.dart';
import 'dart:convert';
import 'package:http/http.dart' as http;

void main() => runApp(new MaterialApp(
  home: new HomePage(),debugShowCheckedModeBanner: false,));

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => new _HomePageState();
}

class _HomePageState extends State<HomePage> {
  TextEditingController controller = new TextEditingController();

  // Get json result and convert it to model. Then add
  Future<Null> getUserDetails() async {
    final response = await http.get(url);
    final responseJson = json.decode(response.body);

    setState(() {
      for (Map user in responseJson) {
        _userDetails.add(UserDetails.fromJson(user));
      }
    });
  }

  @override
  void initState() {
    super.initState();

    getUserDetails();
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text('Home'),elevation: 0.0,),body: new Column(
        children: <Widget>[
          new Container(
            color: Theme.of(context).primaryColor,child: new Padding(
              padding: const EdgeInsets.all(8.0),child: new Card(
                child: new ListTile(
                  leading: new Icon(Icons.search),title: new TextField(
                    controller: controller,decoration: new Inputdecoration(
                        hintText: 'Search',border: InputBorder.none),onChanged: onSearchTextChanged,trailing: new IconButton(icon: new Icon(Icons.cancel),onpressed: () {
                    controller.clear();
                    onSearchTextChanged('');
                  },new Expanded(
            child: _searchResult.length != 0 || controller.text.isNotEmpty
                ? new ListView.builder(
              itemCount: _searchResult.length,itemBuilder: (context,i) {
                return new Card(
                  child: new ListTile(
                    leading: new CircleAvatar(backgroundImage: new NetworkImage(_searchResult[i].profileUrl,title: new Text(_searchResult[i].firstName + ' ' + _searchResult[i].lastName),margin: const EdgeInsets.all(0.0),);
              },)
                : new ListView.builder(
              itemCount: _userDetails.length,index) {
                return new Card(
                  child: new ListTile(
                    leading: new CircleAvatar(backgroundImage: new NetworkImage(_userDetails[index].profileUrl,title: new Text(_userDetails[index].firstName + ' ' + _userDetails[index].lastName),],);
  }

  onSearchTextChanged(String text) async {
    _searchResult.clear();
    if (text.isEmpty) {
      setState(() {});
      return;
    }

    _userDetails.forEach((userDetail) {
      if (userDetail.firstName.contains(text) || userDetail.lastName.contains(text))
        _searchResult.add(userDetail);
    });

    setState(() {});
  }
}

List<UserDetails> _searchResult = [];

List<UserDetails> _userDetails = [];

final String url = 'my url address for MysqL PHP query ';
class UserDetails {
  final int id;
  final String firstName,lastName,profileUrl;

  UserDetails({this.id,this.firstName,this.lastName,this.profileUrl = 'https://i.amz.mshcdn.com/3NbrfEiECotKyhcUhgPJHbrL7zM=/950x534/filters:quality(90)/2014%2F06%2F02%2Fc0%2Fzuckheadsho.a33d0.jpg'});

  factory UserDetails.fromJson(Map<String,dynamic> json) {
    return new UserDetails(
      id: json['id'],firstName: json['name'],lastName: json['username'],);
  }
}

解决方法

试试添加这个

@override
  void dispose() {
    _userDetails .clear();
    _searchResult.clear();

    super.dispose();
  }
,

在添加新值之前尝试清除列表..

setState(() {
  _userDetails.clear();
  for (Map user in responseJson) {
    _userDetails.add(UserDetails.fromJson(user));
  }
});

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?