有时小部件无法在生产版本中呈现

问题描述

有时,小部件无法正确呈现。这仅在发行版本上发生,与平台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;
}

enter image description here

解决方法

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的响应取决于用户的网络状态。请告诉我是否有帮助。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...