为什么我在异步函数中使用 setState 而不是更新状态(Flutter)?
Why I use setState in async funtion not update state (Flutter)?
为什么我的_image没有更新?
我需要 _image 当用户从图库或相机中选择新图像时更新属性,但是当用户选择新图像时,我使用 setState 将新值设置为 _image 但它没有用(没有更新 UI)。
这里我的代码有问题:
抱歉,我无法获取完整源代码,因为 Whosebug 的编辑抱怨很多代码。
全状态 Class:
枚举 ChooseMedia { 相机,画廊 }
File _image;
void getImage(ChooseMedia media) async {
if (media == ChooseMedia.camera) {
var image = await ImagePicker.pickImage(source: ImageSource.camera);
var pathLocal = await getApplicationDocumentsDirectory();
await image.copy('${pathLocal.path}/profileImage.jpg').then((_) {
setState(() {
_image = image;
});
});
}
if (ChooseMedia.gallery == media) {
var image = await ImagePicker.pickImage(source: ImageSource.gallery);
var pathLocal = await getApplicationDocumentsDirectory();
await image.copy('${pathLocal.path}/profileImage.jpg').then((_) {
setState(() {
_image = image;
});
});
}
}
@override
Widget build(BuildContext context) {
return PopupMenuButton(
elevation: 5,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(15))),
onSelected: (ChooseMedia media) {
getImage(media);
},
itemBuilder: (BuildContext context) => <PopupMenuEntry<ChooseMedia>>[
const PopupMenuItem<ChooseMedia>(
value: ChooseMedia.gallery,
child: ListTile(
leading: Icon(
Icons.picture_in_picture,
),
title: Text('From galaxy'),
),
),
const PopupMenuItem<ChooseMedia>(
value: ChooseMedia.camera,
child: ListTile(
leading: Icon(Icons.camera),
title: Text('Take picture'),
),
),
],
child: Container(
decoration: BoxDecoration(),
padding: EdgeInsets.all(7),
child: CircleAvatar(
backgroundImage: _image == null
? AssetImage('assets/images/profile.jpg')
: FileImage(_image))),
);
}
您正在混合 'await' 和 'then'
就做
var copiedImage = await image.copy('${pathLocal.path}/profileImage.jpg');
setState(() {
_image = copiedImage;
});
为什么我的_image没有更新?
我需要 _image 当用户从图库或相机中选择新图像时更新属性,但是当用户选择新图像时,我使用 setState 将新值设置为 _image 但它没有用(没有更新 UI)。
这里我的代码有问题: 抱歉,我无法获取完整源代码,因为 Whosebug 的编辑抱怨很多代码。
全状态 Class: 枚举 ChooseMedia { 相机,画廊 }
File _image;
void getImage(ChooseMedia media) async {
if (media == ChooseMedia.camera) {
var image = await ImagePicker.pickImage(source: ImageSource.camera);
var pathLocal = await getApplicationDocumentsDirectory();
await image.copy('${pathLocal.path}/profileImage.jpg').then((_) {
setState(() {
_image = image;
});
});
}
if (ChooseMedia.gallery == media) {
var image = await ImagePicker.pickImage(source: ImageSource.gallery);
var pathLocal = await getApplicationDocumentsDirectory();
await image.copy('${pathLocal.path}/profileImage.jpg').then((_) {
setState(() {
_image = image;
});
});
}
}
@override
Widget build(BuildContext context) {
return PopupMenuButton(
elevation: 5,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(15))),
onSelected: (ChooseMedia media) {
getImage(media);
},
itemBuilder: (BuildContext context) => <PopupMenuEntry<ChooseMedia>>[
const PopupMenuItem<ChooseMedia>(
value: ChooseMedia.gallery,
child: ListTile(
leading: Icon(
Icons.picture_in_picture,
),
title: Text('From galaxy'),
),
),
const PopupMenuItem<ChooseMedia>(
value: ChooseMedia.camera,
child: ListTile(
leading: Icon(Icons.camera),
title: Text('Take picture'),
),
),
],
child: Container(
decoration: BoxDecoration(),
padding: EdgeInsets.all(7),
child: CircleAvatar(
backgroundImage: _image == null
? AssetImage('assets/images/profile.jpg')
: FileImage(_image))),
);
}
您正在混合 'await' 和 'then' 就做
var copiedImage = await image.copy('${pathLocal.path}/profileImage.jpg');
setState(() {
_image = copiedImage;
});