В моем приложении есть страница, на которой я показываю список контактов в телефоне. На этой странице я использую 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, но я не могу понять, как это сделать правильно. Любая помощь будет оценена. Спасибо.