Как использовать image_picker в flutter

#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. Вы пробовали заглянуть в примерное приложение ? Возможно, вы найдете там то, что вам действительно нужно.

4. Примеры выбора изображения с помощью Flutter

Ответ №1:

flutter imagepicker- pickimage устарел.

На самом деле функция 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 -> SelectionItems

2. Проблема заключалась в том, что 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');
    }
  }