Flutter Flatter,正在尝试从存储更新图片
我正在尝试从firebase存储上传和更新图片。但由于某些原因,这并不能正常工作 这将是一种情况;一个用户从他的相机中拍摄了一张照片,所以这张照片被上传到我的存储器中,这样我就可以得到Flutter Flatter,正在尝试从存储更新图片,flutter,asynchronous,dart,stream-builder,Flutter,Asynchronous,Dart,Stream Builder,我正在尝试从firebase存储上传和更新图片。但由于某些原因,这并不能正常工作 这将是一种情况;一个用户从他的相机中拍摄了一张照片,所以这张照片被上传到我的存储器中,这样我就可以得到url照片,这样我就可以像NetworkImage(url)一样使用它来更新照片 这就是目前正在发生的事情: 假设我没有任何照片 我用新图片更新我的个人资料。(这很好用) 现在让我们假设我想更新我的个人资料图片,所以我拍摄了另一张图片,我们称之为A,所以我上传了这张 什么都没发生,画面也没变 但是如果我再
url
照片,这样我就可以像NetworkImage(url)
一样使用它来更新照片
这就是目前正在发生的事情:
假设我没有任何照片
- 我用新图片更新我的个人资料。(这很好用)
A
,所以我上传了这张
- 什么都没发生,画面也没变
B
图片,由于某种原因,图片会用a
图片更新
这将是我的代码和我如何面对这个特性。 我有下一个方法,当用户点击他的图片时调用。我等待结果(值),所以当我得到结果时,我上传图片。然后,上传图片时,我只需调用setState并将
url
保存到\u 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,如果为True,我只使用资产默认值的pic
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...
在这里,当图像被拾取时,您应该直接设置它,或者您可以在firebase上载成功完成后设置它 但是,您不必在上传后从Firebase URL加载图像,而是可以直接从拾取的文件加载图像,如下所示:
image = Image.memory(await pickedFile.readAsBytes())
这将立即设置图像,并为您保存对Firebase的读取调用。您应该尽可能尽量减少Firebase读取。对不起,您能给我一个如何基于我的代码实现它的示例吗?我已经用我尝试过的东西更新了,但是我有点迷路了。谢谢你!我没有使用
Image.memory()
方法,而是使用了类型File
,因此在小部件中我可以使用FileImage(File)
。谢谢你的提示!
child: CircleAvatar(
radius: 75,
backgroundImage: profilePicture
? pictureTemp == null
? AssetImage(_imageUrl)
: Image.memory(pictureTemp)
: AssetImage(_imageUrl),
),
image = Image.memory(await pickedFile.readAsBytes())