Элемент управления не вводит l oop в флаттер - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть список типа курса. Я использую провайдеров для добавления значений в список. При попытке сохранить данные внутри карты, элемент управления не вводит l oop. Мне было интересно, что заставляет контроль ускользать от l oop. Очень ценю любую помощь. Заранее спасибо!

У меня есть модель класса для курса,

class Course {
  List<Map<String, List<String>>> list;
  Course(this.list);
}

Внутри класса провайдера,

  List<Course> _list = [];

  List<Course> get values => _list;

  void addValues(String coursename, String newValue) {
    // ! Control doesn't enter the loop
    values.map((course) {
      print('inside values.map');
      course.list.map((element) {
        element['$coursename'] = ['$newValue'];
        print('added map : $element');
      });
    }).toList();
    notifyListeners();
  }


Вызов addValues ​​

void clicked(String courseName, String newValue, BuildContext context) {
    if (newValue != null) {
      Provider.of<CourseProvider>(context, listen: false)
          .addValues(courseName, newValue);
    } 
    Navigator.pop(context);
  }

Фиктивный список для справки:

 List<Course> _list = [
    Course(
      list: [
       {
        'Morning_0': ['aaa', 'bbb', 'ccc', 'ddd']
      },
      {
        'Evening_0': ['eee', 'fff', 'ggg']
      },
      ],
    ), //1
  ];


1 Ответ

0 голосов
/ 06 февраля 2020

Использование функции map для перебора списка для изменения его содержимого подвержено ошибкам и его следует избегать. Также создается новый экземпляр списка для каждого вызова toList(), что не соответствует вашим ожиданиям. Вместо этого вы должны использовать стандартные циклические методы, такие как forEach или for l oop для вашего случая использования. Ниже приведены стандартные механизмы зацикливания, доступные для языка дартс.

  1. forEach
  2. для l oop
  3. Пока
  4. do-while

Проверьте языковой тур для подробнее .


Ну, вы предупредили достаточно , теперь здесь я объясню техническую причину, по которой ваш код не работает.

Есть две причины.

  1. Если список _ изначально пуст, первая функция карты не будет вызвана. Поэтому вам нужно убедиться, что ваш список не пуст, прежде чем использовать функцию карты.
  2. Вы забыли позвонить toList() на course.list.map

Пока возвращается Iterable не повторяется, предоставленная функция не будет вызываться.

см. отредактированный фрагмент ниже

 values.map((course) {
  print('inside values.map');
  course.list.map((element) {
    element['$coursename'] = ['$newValue'];
    print('added map : $element');
  }).toList();
}).toList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...