Обычно, когда вы хотите сделать свой пользовательский интерфейс зависимым от данных из inte rnet во Flutter, вы обычно используете FutureBuilder
, если знаете, что данные никогда не меняются. Вы также можете использовать StreamBuilder
, который автоматически обновляется, когда данные из inte rnet изменяются, например, когда в список добавляется новый контакт. Попробуйте использовать один из них в своем коде.
В настоящий момент ваш код не так безопасен. Если asyn c функция getAllContacts()
завершится до того, как весь виджет будет построен, приложение скроет sh, потому что вы в конечном итоге вызовете функцию setState()
до того, как состояние виджета будет построено.
Вы можете сделать что-то вроде этого:
class _MyWidgetState extends State<MyWidget> {
Future<List<Contact>> contacts;
@override
void initState() {
super.initState();
contacts = getAllContacts();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: FutureBuilder<List<Contact>>(
future: contacts,
builder: (BuildContext context, AsyncSnapshot<List<Contact>> snapshot) {
if (!snapshot.hasData) {
//Return a loadingscreen or placeholder widget
}
//Access the list of contacts:
List<Contact> myContacts = snapshot.data;
//Return the widget
return Container(
padding: EdgeInsets.all(20),
child: Column(
children: <Widget>[
Text(
'Phone Book',
),
Expanded(
child: ListView.builder(
shrinkWrap: true,
itemCount: myContacts.length,
itemBuilder: (context, index){
Contact contact = myContacts[index];
return ListTile(
title: Text(contact.displayName),
subtitle: Text(
contact.phones.elementAt(0).value
),
leading: (contact.avatar != null && contact.avatar.length > 0) ?
CircleAvatar(backgroundImage: MemoryImage(contact.avatar),
):
CircleAvatar(child: Text(contact.initials()),),
);
},
)
)
],
),
);
},
),
);
}
}
Но также кажется, что что-то не так, когда вы вызываете метод getAllContacts()
. В строке: List<Contact> _contacts = (await ContactsService.getContacts()).toList();
кажется странным вызывать здесь метод toList()
. ContactService.getContact()
, вероятно, уже должен вернуть список контактов