gpt4 book ai didi

flutter - ChangeNotifier挂载等效吗?

转载 作者:行者123 更新时间:2023-12-03 02:55:55 25 4
gpt4 key购买 nike

我正在使用ChangeNotifier从状态小部件中提取一些逻辑到提供程序:class Model extends ChangeNotifier {...}
在我的有状态小组件中,我有:

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

如何检查Widget是否安装在模型中?

例如我如何打电话:
 if (mounted) {
notifyListeners();
}

最佳答案

一种简单的方法是将有状态窗口小部件的“状态”作为参数传递给“模型”。

像这样:

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...

}

或者,您可以在 Provider软件包中使用 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"),
),
),
);
}

}

关于flutter - ChangeNotifier挂载等效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58570120/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com