Как предотвратить повторную инициализацию объекта каждый раз при его вызове? - Дротик / флаттер - PullRequest
0 голосов
/ 11 июля 2020

Для фрагмента кода ниже:

// фрагмент основного класса


class MainState extends State<Main>{

MusicMaterial musicObj = MusicMaterial();
SoundsMaterial soundObj = SoundsMaterial();

  @override
  Widget build(BuildContext context) {
    return Container(
          child: something.value == 0
              ? musicObj 
              : soundObj
        );
  }
}

// фрагмент класса MusicMaterial


class MusicMaterialState extends State<MusicMaterial>{
  @override
  Widget build(BuildContext context) {
    return Row(
          AnotherClass obj1 = AnotherClass(0, 'test'),  
          AnotherClass obj2 = AnotherClass(1, 'test'),
        );
  }
}

/ / snippet of the AnotherClass class


class AnotherClassState extends State<AnotherClass>{
import '../globals.dart' as globals;

@override
  void initState() {
    globals.globalCounter++;  // this variable is just a global variable from the globals.dart page
}

}

// snippet of the global.dart

library my_prj.globals;

globalCounter = 0;

Он продолжает создавать новый экземпляр каждый раз, когда состояние «if» обновляется в Main Государственный класс. Так, например, значение глобального счетчика продолжает расти от 0 до 2 до 4 ... 8 ... Как мы можем гарантировать, что объект не будет повторно инициализирован каждый раз, например void initState () from AnotherClassState вызывается только один раз? то есть значение остается 2 и только 2.

Я пробовал использовать «AutomaticKeepAliveClientMixin и @override bool get wantKeepAlive => true» - т.е. сохраняя его живым, поэтому при следующем вызове он не вызывает initState ( ) снова, но это не сработало.

1 Ответ

2 голосов
/ 11 июля 2020

Надеюсь, я правильно понимаю, что вам нужно. Похоже, вы хотите, чтобы счетчик увеличивался только один раз для каждого типа класса. Я уверен, что есть разные способы сделать это, но мне приходит в голову сделать globalCounter немного сложнее

class GlobalCounter {
  List<String> _keys = List<String>();
  int _counter = 0;

  int get counter => _counter;

  void increaseCounter(String key) {
    // increase only if the key passed as parameter didn't increase already
    if (!_keys.contains(key)) {
      _counter++;
      _keys.add(key);
    }
  }
}

globalCounter = GlobalCounter();

Тогда вы можете использовать его вот так

@override
void initState() {
    // pass the type of the instance trying to increase the counter
    globals.globalCounter.increaseCounter(this.runtimeType.toString()); 
}
...