#flutter
#flutter
Вопрос:
Я не понимаю, как использовать image_picker, вот как я использую его в своем приложении (как и во многих руководствах):
class AddDialogState extends State<AddDialog> {
File galleryFile;
Widget _onlyStatus() {
getLocalImage() async {
var _galleryFile = await ImagePicker.pickImage(
source: ImageSource.gallery
};
setState(() {
galleryFile = _galleryFile;
});
print(_galleryFile.path);
}
return Column(
........
FlatButton.icon(
onPressed: () {
getLocalImage();
}
)
)
}
@override
Widget build(BuildContext context) {
// fullscreen dialog
.........
body: _onlyStatus()
}
}
Проблема заключалась в том, что приведенный выше код не запускает ImagePicker, когда я нажимаю на плоскую кнопку, приведенный выше код просто выдает ошибку the getter 'path' was called on null
, он не запускает никаких новых действий, связанных с галереей, так что не так с моим кодом?
Комментарии:
1. Есть ли приложение галереи на вашем тестовом устройстве? Я предполагаю, что вы используете Android, поскольку вы говорили о каком-то действии. Для iOS требуется дополнительная настройка.
2. Да, галерея MIUI
3. Вы пробовали заглянуть в примерное приложение ? Возможно, вы найдете там то, что вам действительно нужно.
Ответ №1:
На самом деле функция pickImage() теперь устарела. Итак, вы должны использовать ImagePicker.getImage(источник: ImageSource.gallery)
Нажмите здесь для получения дополнительной информации
void getImage(ImageSource imageSource) async {
PickedFile imageFile = await picker.getImage(source: imageSource);
if (imageFile == null) return;
File tmpFile = File(imageFile.path);
final appDir = await getApplicationDocumentsDirectory();
final fileName = basename(imageFile.path);
tmpFile = await tmpFile.copy('${appDir.path}/$fileName');
setState(() {
_image = tmpFile;
});
}
Код также сохраняет файл изображения в каталоге устройства. Также используется Path pacakage.
Ответ №2:
Вот мой пример, вам нужно только вызвать SelectionItem и передать необходимые параметры, и все готово, также он включает поддержку Android и iOS.
class SelectionItem {
String text;
GestureTapCallback action;
SelectionItem({
this.text,
this.action,
});
}
Widget _getOptionWidget(SelectionItem item) {
return SimpleDialogOption(
onPressed: item.action,
child: Text(item.text),
);
}
Widget _getCupertinoOptionWidget(SelectionItem item) {
return CupertinoActionSheetAction(
onPressed: item.action,
child: Text(item.text),
);
}
showSelector(
BuildContext context, {
String title,
List<SelectionItem> actions,
}) {
bool isAndroid = Injector.instance.platform == Platform.ANDROID;
if (isAndroid) {
final items = actions.map((action) => _getOptionWidget(action)).toList();
return SimpleDialog(
title: Text(title),
children: items,
);
} else {
final items =
actions.map((action) => _getCupertinoOptionWidget(action)).toList();
return Column(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
CupertinoActionSheet(
title: Text(title),
actions: items,
cancelButton: CupertinoActionSheetAction(
onPressed: () {
NavigationUtils.pop(context);
},
child: Text("Cancel"),
),
),
],
);
}
}
Комментарии:
1. Спасибо, но куда я должен поместить SelectionItem и какое действие?
2. вы должны создать ShowDialog с кнопкой для перехода в галерею, для этого действия кнопки вы должны вызвать SelectionItem, и он отобразит вашу галерею
Ответ №3:
ваш ShowDialog должен быть примерно таким:
Container(
width: 300,
height: 300,
child: GestureDetector(
onTap: () {
showDialog(
context: context,
builder: (BuildContext context) => showSelector(
context,
"Select",
actions: [
SelectionItem(
"Camera",
action: () {
getImage(ImageSource.camera);
Navigator.of(context).pop();
},
),
SelectionItem(
"Gallery",
action: () {
getImage(ImageSource.gallery);
Navigator.of(context).pop();
},
)
],
),
);
},
),
)
Комментарии:
1. Я пытался, но
Too many positional arguments: 0 expected, but 1 found
в showSelector -> actions -> SelectionItems2. Проблема заключалась в том, что ImagePicker не запускает никаких действий для выбора изображения, я добавляю
ImagePicker.pickImage(source: ImageSource.gallery)
к кнопке, и когда я нажимаю эту кнопку, ничего не происходит, никаких новых действий3. Послушайте, все, что вам нужно, это включить код showSelector из моего первого ответа, а затем вызвать showSelector в действии onTap () или onPress(), которое вы хотите и должно работать безупречно в качестве моего второго ответа
Ответ №4:
Вот мой код для image_picker: ^ 0.8.4 4 (flutter 2.8.1)
bool hasImage = false;
File? image;
Future getImage(ImageSource source) async {
try {
final image = await ImagePicker().pickImage(source: source);
if (image == null) return;
final imageTemporary = File(image.path);
setState(() {
this.image = imageTemporary;
hasImage = true;
});
} on PlatformException catch (e) {
debugPrint('Failed to pick image: $e');
}
}