title: Flutter with filter search page keeps adding same list view from query when returning to the page
body: <p>I recently followed this answer : <a href="https://stackoverflow.com/questions/50567295/listview-filter-search-in-flutter">Listview filter search in Flutter</a>  on how to achieve a Flutter Listview with search filter . The filter works as explained in the answer . The problem each time i move of out of that particular page and then come back to it , then my results in the listview has doubled. When I go out of the page again , and come back again , it has tripled on so on .</p>
  <p>I know  I am supposed to clear the list somewhere when go out of the listview page , not sure where thou . Below the code from the example i followed . My MySQL Query is simply . SELECT * FROM  table_name.</p>
  <pre><code>import 'dart:async';
  
  import 'package:flutter/material.dart';
  import 'dart:convert';
  import 'package:http/http.dart' as http;
  
  void main() =&gt; runApp(new MaterialApp(
    home: new HomePage(),
    debugShowCheckedModeBanner: false,
  ));
  
  class HomePage extends StatefulWidget {
    @override
    _HomePageState createState() =&gt; new _HomePageState();
  }
  
  class _HomePageState extends State&lt;HomePage&gt; {
    TextEditingController controller = new TextEditingController();
  
    // Get json result and convert it to model. Then add
    Future&lt;Null&gt; 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: &lt;Widget&gt;[
            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,
                itemBuilder: (context, 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),
                    ),
                    margin: const EdgeInsets.all(0.0),
                  );
                },
              ),
            ),
          ],
        ),
      );
    }
  
    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&lt;UserDetails&gt; _searchResult = [];
  
  List&lt;UserDetails&gt; _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&lt;String, dynamic&gt; json) {
      return new UserDetails(
        id: json['id'],
        firstName: json['name'],
        lastName: json['username'],
      );
    }
  }
  </code></pre>