Flutter - передать список будущего в SearchDelegate - PullRequest
0 голосов
/ 01 февраля 2019

Я следовал учебному пособию по поиску флаттера в - скучном флаттер-шоу .Я пытался реализовать ту же функциональность, используя список, который получен из Future List, где данные поступают из API (в данном случае и с сервера Aqueduct).

В настоящее время на моем экране перечислены все контакты из API, теперь я хочу выполнить поиск по этому списку контактов.Я предполагаю, что было бы лучше передать тот же список (который уже отображается) делегату поиска.К сожалению, я не уверен, как этого добиться.

Мой код выглядит следующим образом (обратите внимание, я сократил часть кода для этих примеров):

class _ContactsScreenState extends State<ContactsScreen> {
  static const _usersUrl = //url info;
  static final _token = //token info;
  static final _headers = {
    "Content-type" : "application/json", 
    "Accept": "application/json",
    "Authorization": "Bearer $_token",
  };

  HttpRequestStatus httpRequestStatus = HttpRequestStatus.NOT_DONE;

  Future<List<Contact>> readContacts() async {
    final response = await http.get(_usersUrl, headers: _headers);
    List responseJson = json.decode(response.body.toString());
    List<Contact> contactList = createContactList(responseJson);
    return contactList;
  }

  List<Contact> createContactList(List data) {
    List<Contact> list = List();

    for (int i = 0; i < data.length; i++) {
      String name = data[i]["name"];
      int id = data[i]["id"];
      Contact user = Contact(name: name, id: id);
      list.add(user);
    }
    return list;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('List Contacts'),
        actions: [
          IconButton(
            icon: Icon(Icons.search),
            tooltip: 'Search',
            onPressed: (){
               showSearch(
                 context: context,
                 delegate: ContactSearch(),
               );
            }
          ),
        ],
      ),

      body: Container(
        child: FutureBuilder<List<Contact>>(
          future: readContacts(),
          builder: (context, snapshot) {
            if (snapshot.hasData) {
               //Code which displays the data (works fine);
            }
          }
        ),
      )
    )
  }
}


class ContactSearch extends SearchDelegate<Contact> {
  @override
  <Widget> buildActions(BuildContext context){
    //
  }
  @override
  Widget buildLeading(BuildContext context){
    //
  }
  @override
  Widget buildSuggestions(BuildContext context){
    //Pass contacts list to here and compares agains 'query' 
  }
  @override
  Widget buildResults(BuildContext context) {
    return container();
  }
}

Итак,Короче говоря, мне нужно передать правильный список / данные через ContactSearch ():

showSearch(
  context: context,
  delegate: ContactSearch(),
);

Заранее спасибо.

1 Ответ

0 голосов
/ 01 февраля 2019

По сути, вам нужно переместить FutureBuilder дальше вверх по иерархии виджетов, чтобы под ним находилось как поле поиска, так и тело.Затем вы можете просто вставить свои данные в ContactSearch.

Например:

@override
Widget build(BuildContext context) {
  return FutureBuilder<List<Contact>>(
      future: readContacts(),
      builder: (context, snapshot) {
        return Scaffold(
          appBar: AppBar(
            title: Text('List Contacts'),
            actions: [
              IconButton(
                  icon: Icon(Icons.search),
                  tooltip: 'Search',
                  onPressed: !snapshot.hasData ? null : () {
                    showSearch(
                      context: context,
                      delegate: ContactSearch(snapshot.data),
                    );
                  }
              ),
            ],
          ),

          body: Container(
            child:
            (snapshot.hasData ?
            //Code which displays the data (works fine);
                : /* show errors/progress/etc. */),
          ),
        );
      }
  );
}
...