setState() 在 dispose() 之后被调用。

10 浏览
0 Comments

setState() 在 dispose() 之后被调用。

我正在尝试使用Flutter和Firebase对用户进行身份验证。一旦用户创建了他的账号,他将被重定向到邮箱验证界面,在那里他需要点击通过邮件发送的链接。之后,在验证通过后,他的名字将显示在主屏幕上。

问题是,每当我尝试从云Firestore获取他的姓和名时,总是出现以下错误:在dispose()之后调用了setState()。

这是我的代码:

class HomeScreen extends StatefulWidget {

const HomeScreen({super.key});

@override

State createState() => _HomeScreenState();

}

class _HomeScreenState extends State {

final user = FirebaseAuth.instance.currentUser;

String? firstname;

String? lastname;

void getData() {

FirebaseFirestore.instance

.collection('users')

.doc(user!.uid)

.snapshots()

.listen((data) {

setState(() {

firstname = data.data()!['nom'];

lastname = data.data()!['prenom'];

});

});

}

@override

void initState() {

getData();

super.initState();

}

@override

Widget build(BuildContext context) {

return Scaffold(

appBar: AppBar(

automaticallyImplyLeading: false,

),

body: SafeArea(

child: Column(

crossAxisAlignment: CrossAxisAlignment.start,

children: [

Padding(

padding: EdgeInsets.only(left: 12.0),

child: Row(

mainAxisAlignment: MainAxisAlignment.start,

children: [Text('你好,', style: GoogleFonts.lato())],

),

),

SizedBox(

height: 10,

),

Padding(

padding: const EdgeInsets.only(left: 12),

child: Text('${firstname} ${lastname}'.toUpperCase(),

style: GoogleFonts.lato(

fontSize: 20, fontWeight: FontWeight.bold)),

)]));

我尝试了网上找到的几种解决方案,但无法解决这个问题,唯一有效的解决方案是延迟邮箱验证的计时器。

有人能帮忙解决这个问题吗?提前谢谢!

0
0 Comments

问题:setState()在dispose()之后被调用

问题出现的原因:在dispose之后调用了setState()方法。在dispose()方法中,widget被销毁,而setState()方法用于更新widget的状态,因此在widget被销毁后调用setState()方法会导致错误。

解决方法:在dispose()方法中取消对stream的监听,以避免在widget被销毁后仍然保持对stream的监听。具体方法如下:

void initState() {

super.initState();

getData();

}

void dispose() {

_streamSubscription.cancel();

super.dispose();

}

在initState()方法中,获取数据并开始对stream的监听。在dispose()方法中,取消对stream的监听,确保在widget被销毁后不再保持对stream的监听。

一些讨论中提到了在getData()方法中直接将值赋给变量,而不使用setState()方法。这是另一种解决方法,但并不直接解决问题的根本原因。取消对stream的监听是避免在dispose之后调用setState()方法的正确方法。

希望以上内容能够对你理解和解决问题有所帮助。

0
0 Comments

在Flutter开发中,有时会遇到这样的问题:在调用`dispose()`方法之后,再调用`setState()`方法会导致报错`setState() called after dispose()`。那么,为什么会出现这个问题,以及如何解决呢?

出现这个问题的原因是,在调用`dispose()`方法之后,widget已经处于不可用状态,此时再调用`setState()`方法会导致异常。一种常见的情况是,在异步操作中,当异步任务完成后,可能会调用`setState()`方法来更新UI,但是如果异步任务完成之前widget已经被销毁,再调用`setState()`方法就会出现上述的问题。

解决这个问题的方法是,在调用`setState()`方法之前,先检查widget的`mounted`属性,判断widget是否处于可用状态。如果`mounted`属性为`true`,则调用`setState()`方法;如果`mounted`属性为`false`,则不执行任何操作,避免出现异常。

具体的代码实现如下:

if (this.mounted) {

setState(() {

// Your state change code goes here

});

}

通过上述的代码,我们可以在调用`setState()`方法之前,先检查widget的`mounted`属性,确保widget处于可用状态,避免出现`setState() called after dispose()`的异常。

希望这篇文章能够帮助你理解`setState() called after dispose()`问题的出现原因以及解决方法,并在Flutter开发中能够避免这个问题的发生。如果你遇到了这个问题,不妨尝试一下上述的解决方法,希望对你有所帮助!

0