flutter,尝试从Storage更新图片



我正在尝试上传并更新firebase存储中的图片。但由于某种原因,这并不正常。

这将是一种情况;一个用户从他的相机中拍摄了一张照片,所以这张照片被上传到我的存储器中,然后我得到了url的照片,所以我可以像NetworkImage(url)一样使用它来更新照片。

这就是目前正在发生的事情:


假设我没有照片。

  • 我用一张新图片更新了我的个人资料。(这非常有效(

现在假设我想更新我的个人资料图片,所以我拍了另一张照片,我们称之为A,所以我上传了这张。

  • 什么都没发生,画面不变

但是,如果我再次尝试使用B图片,由于某种原因,该图片将更新为A图片。


这将是我的代码以及我如何面对这个功能

我有下一个方法,当用户点击他的图片时会调用它。我等待结果(值(,所以当我得到结果时,我上传了图片。然后,当图片上传时,我只需要调用setState并将url保存到_imageUrl变量中。

之后,我将";profilePic";属性添加到true

String _imageUrl = 'assets/profileDefault.jpg';
bool profilePicture = false;
io.File profilePic;
Future getFromCamara() async {
await ImagePicker().getImage(source: ImageSource.camera).then((value) {
profilePic = io.File(value.path);
FirebaseStorage.instance.ref().child('picture').putFile(profilePic);
}).then((result) {
var ref = FirebaseStorage.instance.ref().child('picture');
ref.getDownloadURL().then((loc) => setState(() => _imageUrl = loc));
});
try {
FirebaseFirestore.instance
.collection('Usuarios')
.doc(uid)
.update({'profilePic': true});
} catch (e) {
print(e.toString());
}

所以现在,使用StreamBuilder,我从数据库中获得profilePic的结果,如果为True,我下载URL,如果不是,我只使用资产默认值的图片。

body: StreamBuilder(
stream: FirebaseFirestore.instance.collection('Usuarios').snapshots(),
builder: (context, AsyncSnapshot<QuerySnapshot> snapshot1) {
if (!snapshot1.hasData) {
return Center(
child: CircularProgressIndicator(),
);
}
List<DocumentSnapshot> users = snapshot1.data.docs;
for (DocumentSnapshot user in users) {
if (user.id == userID) {
profilePicture = user['profilePic'];
}
}
if (profilePicture) {
FirebaseStorage.instance
.ref()
.child('picture')
.getDownloadURL()
.then((loc) => _imageUrl = loc);
} else {
_imageUrl = 'assets/profileDefault.jpg';
}

return Stack(
alignment: Alignment.center,
children: <Widget>[
Positioned(
top: 0,
child: Container(
color: Color.fromRGBO(255, 0, 0, 70),
width: MediaQuery.of(context).size.width,
height: MediaQuery.of(context).size.height * .55,
),
),
Positioned(
top: MediaQuery.of(context).size.height * .015,
left: 15,
right: 15,
child: Container(
width: MediaQuery.of(context).size.height * .90,
height: 300,
padding: EdgeInsets.only(bottom: 10),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
GestureDetector(
onTap: () => _setPic(context),
child: CircleAvatar(
radius: 79,
backgroundColor: Color(0xFFFFFFFFF),
child: CircleAvatar(
radius: 75,
backgroundImage: profilePicture
? NetworkImage(_imageUrl)
: AssetImage(_imageUrl),
),
),
),
// More code...

我做错了什么?为什么我的照片没有更新?

更新时间:


我试过了,所以我可以在pictureTemp中保存图片的字节,调用setState来重建小部件,并用Image.memory(pictureTemp)放置图片。但它似乎不起作用。

Uint8List pictureTemp;
io.File profilePic;
Future getFromCamara() async {
var pickedFile = await ImagePicker().getImage(source: ImageSource.camera);
var image = await pickedFile.readAsBytes();
FirebaseStorage.instance
.ref()
.child('picture')
.putFile(io.File(pickedFile.path));
setState(() {
pictureTemp = image;
});
child: CircleAvatar(
radius: 75,
backgroundImage: profilePicture
? pictureTemp == null
? AssetImage(_imageUrl)
: Image.memory(pictureTemp)
: AssetImage(_imageUrl),
),

在这里,当图像被拾取时,你应该直接设置它,或者你可以在firebase上传成功后设置它。

但是,您可以直接从拾取的文件加载图像,而不是在上传后从Firebase URL加载图像,如下所示;

image = Image.memory(await pickedFile.readAsBytes())

这将立即设置图像,并为您保存对Firebase的读取调用。您应该尽可能地尽量减少Firebase读取。

最新更新