Dart, Flutter List onTap, чтобы получить индекс записанного на пленку элемента - PullRequest
0 голосов
/ 05 апреля 2020

я создал класс делегата поиска, и то, что я хочу, звучит логически просто, но я не могу обернуть его вокруг, поскольку я - новое программирование, я хочу получить текст или, возможно, я должен сказать строку текста в списке, когда я нажимаю на , затем передайте этот текст в showResult делегата поиска и просмотрите его в текстовом виджете ... вот мой код

import 'package:flutter/material.dart';
import 'package:schooler/style/const.dart';
//follow steps 1 - 3
class DataSearch extends SearchDelegate<String> {
  final List<String> languages = [//3.here is my list
    'dart',
    'Csharp',
    'Java',
    'JavaScript',
    'C++',
    'go ',
    'python',
    'php'
  ];

  final List<String> recentSearch = [
    'go ',
    'python',
    'php',
  ];
  @override
  List<Widget> buildActions(BuildContext context) {
    return [
      IconButton(
        icon: Icon(Icons.clear),
        onPressed: () {
          query = '';
        },
      )
    ];
  }

  @override
  Widget buildLeading(BuildContext context) {
    return IconButton(
      icon: AnimatedIcon(
        icon: AnimatedIcons.menu_arrow,
        progress: transitionAnimation,
      ),
      onPressed: () {
        close(context, null);
      },
    );
  }

  @override
  Widget buildResults(BuildContext context) {
    return Scaffold(
      body: ListView(
        physics: BouncingScrollPhysics(),
        children: <Widget>[
          Row(
            children: <Widget>[
              CircleAvatar(),
              Text(languages[0].substring(query.length)),//2.i want to return the gotten index here
            ],
          ),
        ],
      ),
    );
  }

  @override
  Widget buildSuggestions(BuildContext context) {
    final suggestionList = query.isEmpty
        ? recentSearch
        : languages.where((element) => element.startsWith(query)).toList();
    return ListView.builder(
      physics: BouncingScrollPhysics(),
      itemBuilder: (context, index) => ListTile(
        onTap: () {
          showResults(context); //1.when i tap the item on the listTile i want it to get the index of the taped item
        },
        leading: query.isEmpty
            ? Icon(
                Icons.history,
              )
            : Icon(Icons.search),
        title: RichText(
          text: TextSpan(
            text: suggestionList[index].substring(
              0,
              query.length,
            ),
            style: TextStyle(
              color: kBlackColor,
              fontWeight: kBold,
            ),
            children: [
              TextSpan(
                text: suggestionList[index].substring(query.length),
                style: TextStyle(color: kGreyColor),
              ),
            ],
          ),
        ),
      ),
      itemCount: suggestionList.length,
    );
  }
}

здесь, если я нажму 'go', он должен получить получить текст и передать его в showResult

вот мой результат шоу ... но я просто жестко запрограммировал свой индекс 'list [0] там ", я думаю, что я пытаюсь скажем, получить текст от элемента, который я приклеил и показать его здесь

1 Ответ

0 голосов
/ 05 апреля 2020

Сначала давайте исправим ваш itemBuilder в вашем ListView, чтобы он проиндексировал каждый элемент, а затем добавили этот индекс в вызов функции showResults (), чтобы у вас был к нему доступ:

ListView.builder(
      physics: BouncingScrollPhysics(),
      itemBuilder: (context, index) => ListTile( // Add index here to pass the index to the builder.
        onTap: () {
          showResults(context, index); // Add the index to function call
        },

Просто убедитесь, что ваши showResults ( ) функция модифицируется для принятия параметра индекса int, и хотя я не вижу этой функции, я предполагаю, что она вызывает buildResults () в какой-то момент, который необходимо изменить для принятия индекса:

@override
  Widget buildResults(BuildContext context, int index) {
    return Scaffold(
      body: ListView(
        physics: BouncingScrollPhysics(),
        children: <Widget>[
          Row(
            children: <Widget>[
              CircleAvatar(),
              Text(languages[index].substring(query.length)),// Use the index here to return the desired text
            ],
          ),
        ],
      ),
    );
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...