问题描述
有时,小部件无法正确呈现。这仅在发行版本上发生,与平台OS无关。不仅文本,有时还有其他小部件(例如容器),图像也不会被渲染。这种“空白状态”与应用程序的生命周期无关,这意味着当应用程序在后台,进入前台或重新打开时都会发生这种情况。我可以正常使用该应用程序,而不会出现任何问题,但是看不到我应该看到的任何小部件。我们发现有状态小部件中发生了多次重建,该小部件负责根据用户的登录状态检查和路由用户。
这种方法有什么问题吗?
//初始化(状态变量)
Widget widgetToRender = Splash();
var _firestore;
bool isLoading = false;
StreamSubscription userProfileSubscription;
//初始化功能
void _intialise(BuildContext context) async {
if (isLoading) {
return;
}
_firestore = Provider.of<FirestoreService>(context);
userProfileSubscription = _firestore.userProfile.listen((userProfile) {
this.setState(() {
isLoading = true;
widgetToRender = App();
});
});
}
//构建方法
@override
Widget build(BuildContext context) {
if (widget.userSnapshot.connectionState == ConnectionState.active) {
if (widget.userSnapshot.hasData) {
_intialise(context);
} else {
setState((){
widgetToRender = AuthLanding();
})
}
}
return widgetToRender;
}
解决方法
Flutter是一个声明性框架。 当您声明这样的小部件时,您将与之相反:
public class BClass extends AClass{
public BClass(String name,String sex) {
this.sex = sex;
super.setName(name);
}
@Override
public String getSex() {
return sex;
}
@Override
public void setSex(String sex) {
this.sex = sex;
}
}
public class AClass {
protected String name,sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
此外,您不应该从构建方法中调用执行命令性代码的方法:
Widget widgetToRender = Splash();
我的建议是完全删除此代码:
_intialise(context);
并以声明方式重写内容。一种方法是使用Widget widgetToRender = Splash();
var _firestore;
,并使用其构建器返回所需的小部件。
解决这个问题可能会解决您的渲染问题。
编辑:步骤1可能是删除构建方法中的所有命令性代码和状态变量:
StreamBuilder
,
负载延迟是因为您仅使用widget.userSnapshot.connectionState == ConnectionState.active,您将需要添加进度指示器,因为来自Firestore的响应取决于用户的网络状态。请告诉我是否有帮助。