Получить длину будущего вар в флаттер - PullRequest
0 голосов
/ 02 ноября 2019

Я использую пакет shared_preferences , чтобы сохранить мой объект. Когда я загружаю свое приложение, я получаю предыдущие команды, которые я создал. Если я ничего не получаю (в первый раз), я создаю 2 команды по умолчанию. Вот что у меня есть:

Future<Null> _getTeams() async {
  final prefs = await SharedPreferences.getInstance();
  return prefs.get("teams") ??
      [
        {"name": "Team 2", "avatar": "assets/images/draw1.jpg"},
        {"name": "Team 3", "avatar": "assets/images/draw2.jpg"},
      ];
}

class MyState extends State<TeamsPage> {
  final _listKey = GlobalKey<AnimatedListState>();
  Future<List<Map>> _teams = _getTeams();

Проблема возникает, когда мой виджет должен динамически отображать эти команды. Они еще не готовы, будучи переменной Future, поэтому я получаю ошибку с длиной и индексом:

child: AnimatedList(
                key: _listKey,
                initialItemCount: _teams.length,
                itemBuilder:
                    (BuildContext context, int index, Animation animation) {
                  return _buildItem(_teams[index], index, animation);
                },
              ),

с index Я получаю эту ошибку:

Оператор«[]» не определено для класса «Будущее>». Попробуйте определить оператор '[]'

и с помощью length:

Длина getter не определена для класса 'Future>'

1 Ответ

1 голос
/ 02 ноября 2019

Вы должны вернуть будущее> или любой другой тип команды. Поскольку этот метод асинхронный, вы должны использовать await для работы с его результатом.

Future<List<Team>> _getTeams() async {
  final prefs = await SharedPreferences.getInstance();
  return prefs.get("teams") ??
      [
        {"name": "Team 2", "avatar": "assets/images/draw1.jpg"},
        {"name": "Team 3", "avatar": "assets/images/draw2.jpg"},
      ];
}

var teams = await _getTeams();

Если вы не определили тип для команды, используйте List> в качестве универсального типа в будущем. Затем вы можете получить доступ к его содержимому:

var teams = await _getTeams();
var firstTeamName = teams[0]['name'];
...