Flutter - InheritedModel по-прежнему обновляет дочерний объект, даже если он не соответствует аспекту

Добрый день. Я посмотрел видео о InheritedModel Flutter и заинтересовался им. К сожалению, я не могу заставить его работать должным образом.


Резюме: Нужна помощь, как правильно реализовать InheritedModel.

Ожидаемый вывод кода: виджет CountText не должен обновляться при обновлении count параметр в CountModel,

Фактический вывод кода: CountText все еще обновляет (я думаю, что это связано с тем, что родительский виджет является StatefulWidget)


подробности

Я пытаюсь реализовать Counter приложение, использующее InheritedModel, Код ниже мой код

import 'package:flutter/material.dart';

class CountModel extends InheritedModel<String> {

  final int count;  

  CountModel({ this.count, child }) : super(child: child);

  @override
  bool updateShouldNotify(CountModel oldWidget) {
    if (oldWidget.count != count) {
      return true;
    }
    return false;
  }

  @override
  bool updateShouldNotifyDependent(InheritedModel<String> oldWidget, Set<String> dependencies) {
    if (dependencies.contains('counter')) {
      return true;
    }
    return false;
  }

  static CountModel of(BuildContext context, String aspect) {
    return InheritedModel.inheritFrom<CountModel>(context, aspect: aspect);
  }

}

class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Counter',
      theme: Theme.of(context),
      home: Counter(),
    );
  }
}

class Counter extends StatefulWidget {
  @override
  CounterState createState() => CounterState();
}

class CounterState extends State<Counter> {

  int count = 0;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        // title: Text("Counter"),
      ),
      body: CountModel(
        count: count,
        child: CounterText()
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          setState(() {
            ++count;          
          });
        },
        child: Icon(Icons.add),
      ),
    );
  }
}

class CounterText extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    CountModel model = CountModel.of(context, 'test');
    return Text('Count: ${model.count}');
  }  

}

У меня есть CountModel как InheritedModel и CountText виджет, который потребляет данные из CountModel, Как вы можете видеть в реализации CountTextПройдите test при получении CountModel, В моем понимании это не должно быть обновлено, когда count значение обновляется в CountModel. К сожалению, этого не происходит.

1 ответ

Решение

Короче говоря, вы должны использовать const.

Добавить const в конструктор CounterText

class CounterText extends StatelessWidget {
  const CounterText();
  ...
}

и использовать const при создании экземпляра CounterText () (const CounterText ())

class CounterState extends State<Counter> {
  ...

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      ...
      body: CountModel(..., child: const CounterText()),
      ...
    );
  }
}

И вуаля

Я подробно описал, почему это происходит здесь

Другие вопросы по тегам