Значение глобальной переменной Flutter устанавливается при фильтрации списка

avatar
user1032620
9 августа 2021 в 06:38
163
1
0

не знал, как сформулировать этот вопрос, но в данный момент я борюсь со следующим. У меня есть глобальная переменная как таковая:

class GlobalVariables{ 
  static List<Activity> globalActivities = [];
}

Сначала я заполняю список в своем классе домашнего экрана. Это работает. У меня есть второй экран, где я использую переменную для инициализации списка элементов. Здесь пользователь может отфильтровать этот список действий, и на основе фильтра я динамически удаляю элементы из локального списка. Каким-то образом моя глобальная переменная теперь имитирует количество записей в этом локальном списке, которого я не понимаю. Может быть, еще слишком рано, но я не знаю, что происходит.

@override
Widget build(BuildContext context) {

activities = globals.GlobalVariables.globalActivities;
print("act list start: ${globals.GlobalVariables.globalActivities.length}");
// final activities = Provider.of<List<Activity>>(context) ?? [];

// MyUser user = Provider.of<MyUser>(context);


if(widget.typefilter == "Tunnel"){
  print("act list mid 0: ${globals.GlobalVariables.globalActivities.length}");
  activities.removeWhere((i){
    if (i.type == 'Other'){
      return true;
    }else{
      return false;
    }
  });
  print("act list mid 0b: ${globals.GlobalVariables.globalActivities.length}");
}else if (widget.typefilter == "Other"){
  activities.removeWhere((i){
    if (i.type == 'Tunnel'){
      return true;
    }else{
      return false;
    }
  });
}else{
  //nothing
}
print("act list mid 1: ${globals.GlobalVariables.globalActivities.length}");

Журнал печати выглядит следующим образом:

flutter: act list start: 1978
flutter: act list mid 0: 1978
flutter: act list mid 0b: 0
flutter: act list mid 1: 0
flutter: act list end 0: 0

Правильно, что список действий должен быть равен 0, но почему мой глобальный список теперь также равен 0?

спасибо, Тимо

Источник

Ответы (1)

avatar
dumazy
9 августа 2021 в 06:48
1

Когда вы инициализируете activities с помощью activities = globals.GlobalVariables.globalActivities;, вы не создаете новый List, а создаете дополнительную ссылку на существующий List< Activity>.

Если вы не хотите, чтобы изменения в activities отражались на globalActivities, вам необходимо сделать копию, например, с помощью List.of():

List<Activity> activities = List.of(globals.GlobalVariables.globalActivities);

Обратите внимание, что это будет поверхностный клон. У вас не будет глубокой копии Activity внутри, но она снова будет ссылкой. Это означает, что если вы что-то изменили в объекте Activity из одного списка, тот же объект Activity в другом списке будет иметь такие же изменения. Это подходит для вашего варианта использования.

user1032620
9 августа 2021 в 07:04
1

Спасибо друг! Не знал об этом. Мне очень помогло :)

dumazy
9 августа 2021 в 07:07
0

Рад, что смог помочь, удачи!

jamesdlin
9 августа 2021 в 07:31
1

Вы всегда должны предпочесть List.of или .toList для копирования List. List.from теряет информацию о типе и должен затем выполнять приведения во время выполнения, которые в противном случае были бы ненужными. См.: dart.dev/guides/language/efficient-dart/…

dumazy
9 августа 2021 в 08:03
0

Хорошая точка зрения! Я внес правку, чтобы вместо этого предложить .of()