Flutter 我可以扩展State类并重写setState吗

Flutter 我可以扩展State类并重写setState吗,flutter,flutter-layout,flutter-dependencies,Flutter,Flutter Layout,Flutter Dependencies,我一直遇到这样一个问题:当小部件未装入时(尤其是在数据提取之后),您调用setState。我的问题是: 我可以像这样扩展状态类并重写设置状态吗 abstract class MountedState<T extends StatefulWidget> extends State<T> { @override void setState(fn) { if(mounted) super.setState(fn); } } 抽象类MountedState扩

我一直遇到这样一个问题:当小部件未装入时(尤其是在数据提取之后),您调用
setState
。我的问题是:

我可以像这样扩展
状态
类并重写
设置状态

abstract class MountedState<T extends StatefulWidget> extends State<T> {
  @override
  void setState(fn) {
    if(mounted) super.setState(fn);
  }
}
抽象类MountedState扩展状态{
@凌驾
无效设置状态(fn){
如果(安装)超级设置状态(fn);
}
}
我这样做了,它成功了。我只是想知道这是不理想还是我不应该这样

Future<void> fetchSubjectsAndClasses() async {
    try {
      Response res = await TeachersAPI.classesAndSubjects();
      classes = res.data;
      setState(() {});
    } catch (e) {
      print(e);
    }
  }
Future fetchSubjectsAndClasses()异步{
试一试{
Response res=等待教师sapi.classes和受试者();
类别=资源数据;
setState((){});
}捕获(e){
印刷品(e);
}
}

这是导致问题的数据获取。它在
initState

上被调用,这并不理想。处理处理UI的异步函数时,应该使用。这不是强制性的,但它可以处理使用
未来的
数据更新UI时更烦人的部分

您应该在
initState
中获得您的未来,并将其存储在小部件的
State
中。然后将其传递给
build
中的
FutureBuilder

未来我的未来;
@凌驾
void initState(){
super.initState();
myFuture=futureCall();
}
@凌驾
小部件构建(){
回归未来建设者(
未来:我的未来,
生成器:(BuildContext上下文,异步快照){
if(snapshot.hasData){
//显示包含数据的小部件
}
else if(snapshot.hasrerror){
//显示有错误的小部件
}
否则{
//加载时显示小部件
}
}
);
}

如果在未安装小部件时一直调用
setState
,则可能是做错了什么。我认为是@christophermore。通常不应该发生这种情况。它不会一直调用
setState
。我有一些小部件可以通过网络请求获取数据。然后在获取数据后调用setState。但是用户可能在数据返回之前弹出了路由。其中,setState将被调用,但小部件当然不再可用,因此它抛出一个错误@ChristopherMoore@NiklasLehnfeldI没有说您一直在调用
setState
。我说过当小部件未安装时,您一直在调用
setState
。据我所知,您似乎正在执行某种异步调用,而没有
FutureBuilder
,这没有您描述的问题。您需要在没有特殊类的情况下共享生成错误的操作。我在没有
FutureBuilder
的情况下获取数据。然后在完成抓取后更新UI Kay,谢谢!然而,有什么理由我不应该使用我问题中描述的方法吗?@NduJay它可以防止像你现在这样的问题,而且在几乎所有情况下都非常容易。它也可以更有效地取决于环绕元素。是的,我理解。例如,该解决方案还可以防止这些问题,通过扩展我的
MountedState
而不是
State
,我可以轻松地在我的小部件中使用它。有什么具体的原因不应该使用custom
MountedState
类吗。谢谢again@NduJay它非常容易使用,而且效率更高。此外,如果小部件正在销毁且尚未卸载,则当前检查可能不起作用。@您所做的不是错误的,而是样板。