Невозможно передать внутреннюю переменную во вложенном LIstView - PullRequest
0 голосов
/ 01 апреля 2020

В моем приложении есть страница, на которой я показываю список контактов в телефоне. На этой странице я использую ListView, чтобы показать аватар и отображаемое имя. И в этом Listview у меня есть еще Listview, в котором я показываю номера телефонов этого человека. Эти Listviews содержатся в Card, который также содержится в GestureDetector. Когда я нажал GestureDetector, я хочу напечатать отображаемое имя и номер телефона. Вот как я сейчас пытаюсь это сделать.

import 'package:flutter/material.dart';
import 'package:contacts_service/contacts_service.dart';

class ContactsPage extends StatefulWidget {
  @override
  _ContactsPageState createState() => _ContactsPageState();
}

class _ContactsPageState extends State<ContactsPage> {
  Iterable<Contact> _contacts;

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

  Future<void> getContacts() async {
    //We already have permissions for contact when we get to this page, so we
    // are now just retrieving it
    final Iterable<Contact> contacts = await ContactsService.getContacts();
    setState(() {
      _contacts = contacts;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: (Text('Contacts')),
      ),
      body: _contacts != null
          //Build a list view of all contacts, displaying their avatar and
          // display name
          ? ListView.builder(
              itemCount: _contacts?.length ?? 0,
              itemBuilder: (BuildContext context, int index) {
                Contact contact = _contacts?.elementAt(index);
                return GestureDetector(
                  child: Card(
                    child: ListTile(
                    contentPadding:
                        const EdgeInsets.symmetric(vertical: 2, horizontal: 18),
                    leading: (contact.avatar != null && contact.avatar.isNotEmpty)
                        ? CircleAvatar(
                            backgroundImage: MemoryImage(contact.avatar),
                          )
                        : CircleAvatar(
                            child: Text(contact.initials()),
                            backgroundColor: Theme.of(context).accentColor,
                          ),
                    title: Text(
                      contact.displayName ?? '',
                      style: TextStyle(
                        fontFamily: 'Montserrat'
                      ),
                      ),
                    subtitle: ListView.builder(
                      shrinkWrap: true,
                      physics: ClampingScrollPhysics(),
                      itemCount: contact.phones.length,
                      itemBuilder: (BuildContext context, int index){
                        return ListTile(
                          subtitle: Text(
                            contact.phones?.elementAt(index)?.value,
                            style: TextStyle(
                              fontFamily: 'Montserrat'
                            ),
                            ),
                        );
                      },
                    )
                    //This can be further expanded to showing contacts detail
                    // onPressed().
                  ),
                ),
                  onTap: () => {print(contact.phones?.elementAt(index)?.value)},
                );
                },
            )
          : Center(child: const CircularProgressIndicator()),
    );
  }
}

Когда я выполняю это, я получаю список, но когда я нажимаю на элемент, я получаю следующее исключение: The following RangeError was thrown while handling a gesture: RangeError (index): Invalid value: Only valid value is 0: 1

I Я знаю, что это проблема, вызванная попыткой напечатать внутренний элемент List с индексом внешнего элемента List, но я не могу понять, как это сделать правильно. Любая помощь будет оценена. Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...