вернуть список из будущего во флаттере - PullRequest
1 голос
/ 05 марта 2019

Привет, я новичок в трепетании и асинхронном программировании.Мне нужно сделать что-то вроде этого:

List<Widget> usersProfiles = [];
      getUsers('DcofOiHWcjbjD0i18miW').then((user) {
        user.forEach((u) {
          usersProfiles.add(new ListTile(
            leading: CircleAvatar(
              backgroundImage: AssetImage(u.profilePicture),
            ),
            trailing: u.icon,
            title: new Text(u.name),
            onTap: () {
              Navigator.push(context,
                  new MaterialPageRoute(builder: (context) => new Home()));
            },
          ));
        });
      });

, но usersProfiles возвращает null

Я буду очень рад

Ответы [ 2 ]

1 голос
/ 06 марта 2019

Я бы порекомендовал либо FutureBuilder , либо StreamBuilder (для потоков), который дает вам преимущества производительности макета, а также инструменты для простого добавления виджетов загрузки и ошибок. Это может выглядеть следующим образом:

Future<List<User>> usersFuture = getUsers('DcofOiHWcjbjD0i18miW');

Создайте будущее как переменную-член, чтобы вы выбирали его только один раз (в случае, если метод инициирует новое будущее каждый раз, когда вы вызываете его). А затем используйте его внутри FutureBuilder.

FutureBuilder<List<User>>(
    future: usersFuture,
    builder: (context, snapshot) {
      if(snapshot.connectionState != ConnectionState.done) {
        // return: show loading widget
      }
      if(snapshot.hasError) {
        // return: show error widget
      }
      List<User> users = snapshot.data ?? [];
      return ListView.builder(
        itemCount: users.length,
        itemBuilder: (context, index) {
          User user = users[index];
          return new ListTile(
            leading: CircleAvatar(
              backgroundImage: AssetImage(user.profilePicture),
            ),
            trailing: user.icon,
            title: new Text(user.name),
            onTap: () {
              Navigator.push(context,
                  new MaterialPageRoute(builder: (context) => new Home()));
            },
          );
      });
  });
0 голосов
/ 05 марта 2019

Если вы хотите обернуть его в функцию, которая возвращает Future, это будет выглядеть примерно так:

Future<List<Widget>> getUserProfiles() async {
  final List<Widget> userProfiles = [];
  user.forEach((u) {
    usersProfiles.add(new ListTile(
      leading: CircleAvatar(
        backgroundImage: AssetImage(u.profilePicture),
      ),
      trailing: u.icon,
      title: new Text(u.name),
      onTap: () {
        Navigator.push(context, new MaterialPageRoute(builder: (context) => new Home()));
      },
    ));
  });
  return userProfiles;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...