Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 在dispose()之后调用setState()_Flutter - Fatal编程技术网

Flutter 在dispose()之后调用setState()

Flutter 在dispose()之后调用setState(),flutter,Flutter,当我点击升起的按钮时,时间选择器出现了。现在,如果我等待5秒钟,然后确认发生此错误的时间 在dispose()之后调用setState() 我确实在控制台中看到了flatter是如何更新父窗口小部件的,但是为什么呢我什么都不做-我只是等5秒钟!? 这个例子将在一个正常的项目中工作,但是在我的项目中,它将不工作,因为颤振正在更新状态,而我正在等待。。。我错了什么?有没有人猜到,在我更复杂的项目中,而不是在一个简单的项目中,flutter随机更新的可能是什么 [更新] 我检查它是否从TabBar和T

当我点击升起的按钮时,时间选择器出现了。现在,如果我等待5秒钟,然后确认发生此错误的时间 在dispose()之后调用setState()

我确实在控制台中看到了flatter是如何更新父窗口小部件的,但是为什么呢我什么都不做-我只是等5秒钟!? 这个例子将在一个正常的项目中工作,但是在我的项目中,它将不工作,因为颤振正在更新状态,而我正在等待。。。我错了什么?有没有人猜到,在我更复杂的项目中,而不是在一个简单的项目中,flutter随机更新的可能是什么

[更新] 我检查它是否从TabBar和TabBarView所在的级别进行更新。 它是否需要使用tabbarview所需的“with TickerProviderStateMixin”功能?是否会导致应用程序定期和随机刷新

 class DateTimeButton extends State<DateTimeButtonWidget> {
  DateTime selectedDate = new DateTime.now();

  Future initTimePicker() async {
    final TimeOfDay picked = await showTimePicker(
      context: context,
      initialTime: new TimeOfDay(hour: selectedDate.hour, minute: selectedDate.minute),
    );

    if (picked != null) {
      setState(() {
        selectedDate = new DateTime(selectedDate.year, selectedDate.month, selectedDate.day, picked.hour, picked.minute);
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return new RaisedButton(
      child: new Text("${selectedDate.hour} ${selectedDate.minute}"),
      onPressed: () {
        initTimePicker();
      }
    );
  }
}
class DateTimeButton扩展状态{
DateTime selectedDate=new DateTime.now();
Future initTimePicker()异步{
最终拾取的日期时间=等待显示时间选择器(
上下文:上下文,
初始时间:新的日期时间(小时:selectedDate.hour,分钟:selectedDate.minute),
);
如果(已拾取!=null){
设置状态(){
selectedDate=新日期时间(selectedDate.year、selectedDate.month、selectedDate.day、picked.hour、picked.minute);
});
}
}
@凌驾
小部件构建(构建上下文){
返回新的RaisedButton(
子项:新文本(${selectedDate.hour}${selectedDate.minute}”),
已按下:(){
initTimePicker();
}
);
}
}

如果当小部件已被处置时,
未来完成的是预期行为,则您可以使用

if (mounted) {
  setState(() {
    selectedDate = new DateTime(selectedDate.year, selectedDate.month, selectedDate.day, picked.hour, picked.minute);
  });
}
试试这个

Widget build(BuildContext context) {
    return new RaisedButton(
        child: new Text("${selectedDate.hour} ${selectedDate.minute}"),
        onPressed: () async {
            await initTimePicker();
        }
    );
}

在调用
setState()
之前,只需检查小部件状态类的布尔属性
mounted

或者更干净的方法 重写
StatelfulWidget
类中的
setState
方法

class DateTimeButton extends StatefulWidget {
  @override
  void setState(fn) {
    if(mounted) {
      super.setState(fn);
    }
  }
}

只需在
setState()之前写一行

然后

setState(() {
      //Your code
    });

我遇到了同样的问题,我解决了在
initState()
上更改超级构造函数调用顺序的问题:

错误代码:

@override
  void initState() {
    foo_bar(); // in foo_bar i call setState();
    super.initState(); // state initialization after foo_bar()
  }
右代码:

@override
  void initState() {
    super.initState();
    foo_bar(); // first call super constructor then foo_bar that contains setState() call
  }
安装

// First Update data 

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

“使用TickerProviderStateMixin”-是的,我认为这会导致重新构建您的小部件。我建议您不要使用您自己的成员。谢谢。这救了我一天(绝对是一周):D@Gunter,如何在super.dispose()之前调用setState;在dispose()函数中。它不适用于我,并收到类似“package:flatter/src/widgets/framework.dart”的错误消息:失败的断言:第4263行位置12:“\u debugLifecycleState!”_ElementLifecycle.defunct':不正确。我已经在使用if(mounted){setState((){});}请说明问题所在。非常感谢。它只是阻止设置状态,但不能解决无法设置的问题state@temirbek我不确定您的用例是什么,如果条件的目的是在小部件未安装时停止尝试设置状态,则意味着小部件不存在于屏幕上的小部件层次结构中。确定,我的用例是Screen A调用Screen B并等待结果。屏幕B返回结果,但此时屏幕A重新创建,等待结果的旧屏幕已卸载。但是我需要在ScreenA中用ScreenB返回的值设置state你的用例,你或者必须确保ScreenA在ScreenB返回时具有相同的实例,检查ScreenA键是否相同,如果不能这样做,ScreenA必须重新创建新实例,那么你必须用某种方式实现状态管理,比如ScopedModel、Bloc或FlatterRedux等,为什么框架在默认情况下不在内部进行检查?是否有任何情况下可以为已处置的小部件设置状态?!在写答案时,请在代码中写几句话,不要只写一个字。
@override
  void initState() {
    super.initState();
    foo_bar(); // first call super constructor then foo_bar that contains setState() call
  }
// First Update data 

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