ChangeNotifier установлен эквивалент? - PullRequest
1 голос
/ 26 октября 2019

Я извлекаю некоторую логику из Stateful Widget для провайдера с ChangeNotifier: class Model extends ChangeNotifier {...}

В моем Stateful Widget у меня есть:

  if (mounted) {
setState(() {});
}

Как я могу проверить, смонтирован ли Widget вМодель?

Например, как я могу позвонить:

 if (mounted) {
notifyListeners();
}

1 Ответ

1 голос
/ 26 октября 2019

Простой способ - передать «State» вашего Stateful Widget в качестве параметра вашей «Model».

Например:

class Model extends ChangeNotifier {

  Model(this.yourState);

  YourState yourState;

  bool get _isMounted => yourState.mounted;
}

class YourState extends State<YourStatefulWidget> {
  Model model;

  @override
  void initState() {
    super.initState();
    model = Model(this);
  }

  @override
  Widget build(BuildContext context) {
    // your code..
  }
}

Я думаю, вам не нужнопроверьте, установлен State или нет. Вам просто нужно проверить, что Модель уже утилизирована. Вы можете переопределить метод dispose() в ChangeNotifier:

class Model extends ChangeNotifier {
  bool _isDisposed = false;

  void run() async {
    await Future.delayed(Duration(seconds: 10));
    if (!_isDisposed) {
      notifyListeners();
    }  
  }

  @override
  void dispose() {
    super.dispose();
    _isDisposed = true;
  }
}

И не забывайте утилизировать Model при утилизации State:

class YourState extends State {
  Model model;

  @override
  void initState() {
    super.initState();
    model = Model();
  }

  @override
  void dispose() {
    model?.dispose();
    super.dispose();
  }
  /// Your build code...

}

Или вы можетеиспользуйте ChangeNotifierProvider в пакете Провайдер , он поможет вам автоматически утилизировать Model.

class YourState extends State {
  Model model;

  @override
  void initState() {
    super.initState();
    model = Model();
  }

  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<Model>(
      builder: (build) => model,
      child: Container(
        child: Consumer<Model>(
          builder: (context, model, widget) => Text("$model"),
        ),
      ),
    );
  }

}
...