Flutter 颤振-小部件不再出现在小部件树中,或者此错误可能表示内存泄漏警告

Flutter 颤振-小部件不再出现在小部件树中,或者此错误可能表示内存泄漏警告,flutter,dart,Flutter,Dart,我有3页我用底部导航栏检查转换第一页是Soclose在这个页面我从数据库获取信息并在屏幕上打印出来。 我正在顺利地从数据库中获取信息,但当我切换屏幕时,我的控制台会发出警告消息。控制台中出现错误,但应用程序工作正常。更改屏幕并返回到旧页面(Soclose页面)时,会出现错误页面,并在毫秒内消失 我找不到类似的问题,我试图在警告中提出建议,但要么我做不到,要么解决方案不起作用 相关soclose dart文件: class _Closesevents extends State<Socl

我有3页我用底部导航栏检查转换第一页是Soclose在这个页面我从数据库获取信息并在屏幕上打印出来。 我正在顺利地从数据库中获取信息,但当我切换屏幕时,我的控制台会发出警告消息。控制台中出现错误,但应用程序工作正常。更改屏幕并返回到旧页面(Soclose页面)时,会出现错误页面,并在毫秒内消失

我找不到类似的问题,我试图在警告中提出建议,但要么我做不到,要么解决方案不起作用

相关soclose dart文件:

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");
    }
}