Android 如何修复颤振小部件闪烁?

Android 如何修复颤振小部件闪烁?,android,firebase,flutter,google-cloud-firestore,Android,Firebase,Flutter,Google Cloud Firestore,我正试图从firebase存储中加载一个图像到我的应用程序中,但是我遇到了一个奇怪的问题,即配置文件页面(加载该图像的地方)一直闪烁。图像加载良好,但整个小部件一直闪烁。经过一些调试后,我将问题缩小到函数getProfilePic()中调用的setState(),但是我不知道是函数本身还是我对所述函数的调用 另外,fileURL或picRef.getDownloadURL()没有问题,因为我也用一个随机的互联网图像进行了测试,得到了同样的闪烁 class profileTab extends S

我正试图从firebase存储中加载一个图像到我的应用程序中,但是我遇到了一个奇怪的问题,即配置文件页面(加载该图像的地方)一直闪烁。图像加载良好,但整个小部件一直闪烁。经过一些调试后,我将问题缩小到函数getProfilePic()中调用的setState(),但是我不知道是函数本身还是我对所述函数的调用

另外,fileURL或picRef.getDownloadURL()没有问题,因为我也用一个随机的互联网图像进行了测试,得到了同样的闪烁

class profileTab extends StatefulWidget {
  @override
  _profileTabState createState() => _profileTabState();
}

class _profileTabState extends State<profileTab> {

  User user = FirebaseAuth.instance.currentUser;
  String _image = "https://picsum.photos/250?image=9";

  Reference picRef = FirebaseStorage.instance.ref().child(FirebaseAuth.instance.currentUser.uid);

  Future<Widget> getProfilePic() async {
    await picRef.getDownloadURL().then((fileURL){
       setState(() {
         _image = fileURL;
       });
    });
  }

  @override
  Widget build(BuildContext context) {
    getProfilePic();
    return StreamBuilder(
      stream: FirebaseFirestore.instance.collection('users').doc(user.uid).snapshots(),
      builder: (context, snapshot){
        if (snapshot.connectionState == ConnectionState.active){
          return ListView(
              children: <Widget>[
                SizedBox(height: 100.0,),
                CircleAvatar(
                  radius: 100.0,
                  backgroundColor: Colors.lightBlueAccent,
                  child: ClipOval(
                    child: SizedBox(
                      width: 180.0,
                      height: 180.0,
                      child: Image.network(_image,fit: BoxFit.fill,),
                    ),
                  ),
                ),
                SizedBox(height: 30.0,),
                Center(child: Text("Name: " + snapshot.data.data()['name'],textScaleFactor: 3.0,)),
              ]
          );
        }
        else {
          return CircularProgressIndicator();
        }
      },
    );
  }
}
class profileTab扩展StatefulWidget{
@凌驾
_profileTabState createState()=>\u profileTabState();
}
类_profileTabState扩展状态{
User User=FirebaseAuth.instance.currentUser;
字符串_图像=”https://picsum.photos/250?image=9";
Reference picRef=FirebaseStorage.instance.ref().child(FirebaseAuth.instance.currentUser.uid);
将来的getProfilePic()异步{
等待picRef.getDownloadURL()。然后((fileURL){
设置状态(){
_image=fileURL;
});
});
}
@凌驾
小部件构建(构建上下文){
getProfilePic();
返回流生成器(
流:FirebaseFirestore.instance.collection('users').doc(user.uid).snapshots(),
生成器:(上下文,快照){
if(snapshot.connectionState==connectionState.active){
返回列表视图(
儿童:[
尺寸箱(高度:100.0,),
圆形(
半径:100.0,
背景颜色:Colors.lightBlueAccent,
孩子:斜坡(
孩子:大小盒子(
宽度:180.0,
高度:180.0,
子项:Image.network(_Image,fit:BoxFit.fill,),
),
),
),
尺寸箱(高度:30.0,),
中心(子项:文本(“名称:+snapshot.data.data()['Name'],textScaleFactor:3.0,),
]
);
}
否则{
返回循环ProgressIndicator();
}
},
);
}
}

getProfilePic正在通过调用setState重新绘制小部件。 setState调用调用getProfilePic的生成方法

所以,当第一次调用构建方法时,我们调用getProfilePic,它再次更新小部件树。 修复:在getProfilePic中,如果图像为空,则添加检查以调用setState,这将只重新绘制小部件一次。 如果您使用Image.network会更好。你可以参考这个