Flutter 颤振-小部件不再出现在小部件树中,或者此错误可能表示内存泄漏警告
我有3页我用底部导航栏检查转换第一页是Soclose在这个页面我从数据库获取信息并在屏幕上打印出来。 我正在顺利地从数据库中获取信息,但当我切换屏幕时,我的控制台会发出警告消息。控制台中出现错误,但应用程序工作正常。更改屏幕并返回到旧页面(Soclose页面)时,会出现错误页面,并在毫秒内消失 我找不到类似的问题,我试图在警告中提出建议,但要么我做不到,要么解决方案不起作用 相关soclose dart文件:Flutter 颤振-小部件不再出现在小部件树中,或者此错误可能表示内存泄漏警告,flutter,dart,Flutter,Dart,我有3页我用底部导航栏检查转换第一页是Soclose在这个页面我从数据库获取信息并在屏幕上打印出来。 我正在顺利地从数据库中获取信息,但当我切换屏幕时,我的控制台会发出警告消息。控制台中出现错误,但应用程序工作正常。更改屏幕并返回到旧页面(Soclose页面)时,会出现错误页面,并在毫秒内消失 我找不到类似的问题,我试图在警告中提出建议,但要么我做不到,要么解决方案不起作用 相关soclose dart文件: class _Closesevents extends State<Socl
class _Closesevents extends State<Soclose> {
List<Event> eventList;
int eventListLen;
@override
void initState() {
try{
final Future<Database> dbFuture = DbHelper.initializeDatabase();
dbFuture.then((database) {
Future<List<Event>> eventListFuture = DbHelper().getEventList();
eventListFuture.then((eventList) {
setState(() {
this.eventList = eventList;
this.eventListLen = eventList.length;
});
});
});}
catch (e,s)
{
print("[ERROR] $e");
print("[ERROR TREE]\n$s");
}
super.initState();
}
@override
void dispose() {
super.dispose();
}
@override
Widget build(BuildContext context) {
return Container(
child: new ListView.builder(
itemCount: eventListLen,
itemBuilder: (BuildContext context, int index) =>
buildTripCard(context, index)),
);
}
Widget buildTripCard(BuildContext context, int index)
...
问题在于
initState
函数重写。在调用所有其他逻辑之前,最好同时调用initState
的super、super.initState
。您的未来
可能完成得太快,甚至在状态初始化之前调用setState
。只需移动super.initState()
作为重写中的第一条语句。前
@override
void initState() {
super.initState();//Always call this first
try{
final Future<Database> dbFuture = DbHelper.initializeDatabase();
dbFuture.then((database) {
Future<List<Event>> eventListFuture = DbHelper().getEventList();
eventListFuture.then((eventList) {
setState(() {
this.eventList = eventList;
this.eventListLen = eventList.length;
});
});
});}
catch (e,s)
{
print("[ERROR] $e");
print("[ERROR TREE]\n$s");
}
}
@覆盖
void initState(){
super.initState();//始终首先调用此
试一试{
final Future dbFuture=DbHelper.initializeDatabase();
dbFuture.then((数据库){
Future eventListFuture=DbHelper().getEventList();
eventListFuture.then((eventList){
设置状态(){
this.eventList=eventList;
this.eventListLen=eventList.length;
});
});
});}
渔获物(东、南)
{
打印(“[错误]$e”);
打印(“[错误树]\n$s”);
}
}
编辑:但是,这仍然会导致错误,因为在挂载小部件之前仍然可以调用
setState
。这就是为什么存在FutureBuilder
小部件的原因。将需要此Future
数据的小部件包装在build
方法中,将Future
传递给FutureBuilder
的Future
参数,并使用builder
提供的asyncsnashot
访问数据。请参阅有关的详细信息。问题在于您的initState
函数重写。在调用所有其他逻辑之前,最好同时调用initState
的super、super.initState
。您的未来
可能完成得太快,甚至在状态初始化之前调用setState
。只需移动super.initState()
作为重写中的第一条语句。前
@override
void initState() {
super.initState();//Always call this first
try{
final Future<Database> dbFuture = DbHelper.initializeDatabase();
dbFuture.then((database) {
Future<List<Event>> eventListFuture = DbHelper().getEventList();
eventListFuture.then((eventList) {
setState(() {
this.eventList = eventList;
this.eventListLen = eventList.length;
});
});
});}
catch (e,s)
{
print("[ERROR] $e");
print("[ERROR TREE]\n$s");
}
}
@覆盖
void initState(){
super.initState();//始终首先调用此
试一试{
final Future dbFuture=DbHelper.initializeDatabase();
dbFuture.then((数据库){
Future eventListFuture=DbHelper().getEventList();
eventListFuture.then((eventList){
设置状态(){
this.eventList=eventList;
this.eventListLen=eventList.length;
});
});
});}
渔获物(东、南)
{
打印(“[错误]$e”);
打印(“[错误树]\n$s”);
}
}
编辑:但是,这仍然会导致错误,因为在挂载小部件之前仍然可以调用
setState
。这就是为什么存在FutureBuilder
小部件的原因。将需要此Future
数据的小部件包装在build
方法中,将Future
传递给FutureBuilder
的Future
参数,并使用builder
提供的asyncsnashot
访问数据。查看更多信息。我将initState()移到开头,但同样的问题仍然存在。我看到我现在正在尝试使用FutureBuilder,你的想法真的很有道理。感谢您的关注。尝试后我会通知您。我将initState()移到开头,但同样的问题仍然存在。我看到我现在正在尝试使用FutureBuilder,您的想法真的很有意义。谢谢你的关注。我会在尝试后通知你。
@override
void initState() {
super.initState();//Always call this first
try{
final Future<Database> dbFuture = DbHelper.initializeDatabase();
dbFuture.then((database) {
Future<List<Event>> eventListFuture = DbHelper().getEventList();
eventListFuture.then((eventList) {
setState(() {
this.eventList = eventList;
this.eventListLen = eventList.length;
});
});
});}
catch (e,s)
{
print("[ERROR] $e");
print("[ERROR TREE]\n$s");
}
}