Простой способ - передать «Состояние» вашего виджета с отслеживанием состояния в качестве параметра вашей «Модели».
Как это:
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
в пакете Provider, это поможет вам автоматически удалить 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"),
),
),
);
}
}
person
JunYao Yuan
schedule
26.10.2019