【问题标题】:Working with Imager Picker Dependency in Flutter在 Flutter 中使用 Imager Picker 依赖项
【发布时间】:2021-01-13 07:43:36
【问题描述】:

我的应用程序中有一个功能可以帮助用户从图库中选择图片或使用相机拍照。

  _getImage(ImageSource source) async {
    // ignore: deprecated_member_use
    File selectedImage = await ImagePicker.pickImage(
      source: source,
      imageQuality: 50,
      maxWidth: 400.0,
    ).whenComplete(() {
      setState(() {});
    });
    if (_imageFile == null) return;
    
    setState(() {
      _imageFile = selectedImage;
    });
  }

我正在使用这个image_picker dependency,并按照我在其中找到的示例以及其他人在线完成的可能更新示例进行操作。根据this stackoverflow question 的建议,建议我在其中添加 whenComplete,我这样做了。

当我从我的图库中选择一张图片时,它不会更新我屏幕中的图片视图小部件。相机选项也不起作用。我可能会错过什么?

这是显示图像的图像小部件:

return Stack(
    alignment: AlignmentDirectional.bottomCenter,
    children: <Widget>[
      Image.file(
        _imageFile,
        fit: BoxFit.cover,
        height: 250,
      ),
      Container(
        width: 250.0,
        height: 100.0,
        color: Colors.black54,
        child: Column(
          children: <Widget>[
            Text(
              'Change Image',
              style: TextStyle(
                color: Colors.white,
                fontSize: 22.0,
                fontWeight: FontWeight.w400,
              ),
            ),
            Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                //camera button
                IconButton(
                  icon: Icon(FontAwesomeIcons.camera),
                  onPressed: () => _getImage(ImageSource.camera),
                  color: kThemeStyleButtonFillColour,
                ),
                SizedBox(width: 20.0),
                IconButton(
                  icon: Icon(FontAwesomeIcons.fileImport),
                  onPressed: () => _getImage(ImageSource.gallery),
                  color: kThemeStyleButtonFillColour,
                ),
              ],
            ),
          ],
        ),
      ),
      SizedBox(height: 32.0),
    ],
  );

【问题讨论】:

  • 首先停止使用pickImage,因为它已被弃用。使用final pickedFile = ImagePicker().getImage(source: ImageSource.camera); 这将返回一个pickedFile 并且可以使用imageFile = File(pickedFile.Path) 转换为文件
  • 请分享包含Image widget_imageFile变量声明的代码sn-p。
  • getImage 对我不起作用,因为它希望我将其转换为文件。只有 pickImage 会,即使它说它已被弃用,所以我禁止警告。这是 getImage() 给出的错误:“PickedFile”类型的值不能分配给“文件”类型的变量。
  • 我已经编辑了我的问题以添加显示它的图像小部件。
  • 发现问题,查看我的回答,希望它能解决您的问题。 ??????

标签: flutter flutter-layout flutter-dependencies imagepicker


【解决方案1】:

** 我会更新你的代码,试试这个**

import 'package:image_picker/image_picker.dart';

class check extends StatefulWidget {
  @override
  _checkState createState() => _checkState();
}

class _checkState extends State<check> {
  File _imageFile;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: Stack(
      alignment: AlignmentDirectional.bottomCenter,
      children: <Widget>[
        _imageFile !=null ? Image.file(
          _imageFile ,
          height: 250,
          fit: BoxFit.fill,
        ) : Text('No image selected.'),
        SizedBox(height: 100,),
        Container(
          width: 250.0,
          height: 100.0,
          color: Colors.black54,
          child: Column(
            children: <Widget>[
              Text(
                'Change Image',
                style: TextStyle(
                  color: Colors.white,
                  fontSize: 22.0,
                  fontWeight: FontWeight.w400,
                ),
              ),
              Row(
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  //camera button
                  IconButton(
                    icon: Icon(Icons.camera),
                    onPressed: () => _getImage(ImageSource.camera),
                  ),
                  SizedBox(width: 20.0),
                  IconButton(
                    icon: Icon(Icons.attach_file),
                    onPressed: () => _getImage(ImageSource.gallery),

                  ),
                ],
              ),
            ],
          ),
        ),
        SizedBox(height: 32.0),
      ],
    )
    );
  }

  _getImage(ImageSource source) async {
    // ignore: deprecated_member_use
    File selectedImage = await ImagePicker.pickImage(
      source: source,
      imageQuality: 50,
      maxWidth: 400.0,
    );

    setState(() {
      _imageFile = selectedImage;
    });
  }
}

【讨论】:

    【解决方案2】:

    在你的情况下,

       setState(() {
          _imageFile = selectedImage;
        });
    

    不等待选​​中的图片

    试试这个:

       _getImage(ImageSource source) async {
        // ignore: deprecated_member_use
        File selectedImage = await ImagePicker.pickImage(
          source: source,
          imageQuality: 50,
          maxWidth: 400.0,
        );
        setState(() {
             _imageFile = selectedImage;
         });
      }
    

    【讨论】:

    • 我试过这个,它也不起作用。因为我们无法在 selectedImage 未完成时为其赋值。所以我首先将它声明为 File selectedImage;然后我使用了 selected Image = await ....... 但我仍然无法更改显示中的图像。
    • 如果你使用 await 你完成后不需要使用。我会更新代码。
    • 你是对的。如果我在等待,whenComplete 不再有意义。然而,这仍然没有魔法。我正在 iPhone 11 Pro 上进行测试。我终于通过将 selectedImage 类型从 File 更改为 var 来使其工作。没有意义,但就是这样做的。
    【解决方案3】:

    您在 if 语句中使用了错误的逻辑。

    这样做的正确方法,

    if(selectedImage != null) { Update image widget here }

    我认为 imageFile 变量最初没有分配任何文件,因此条件 imageFile == null 始终为真,并且图像小部件永远不会更新。

    【讨论】:

      【解决方案4】:

      我能够让这段代码工作,但黑客仍然击败了我,因为它没有意义。

      我遵循了上面给出的建议,取消了 whenComplete,因为有一个等待。

      我还将 selectedImage 的声明类型从 File 更改为 var,如下所示:

        _getImage(ImageSource source) async {
          var selectedImage;
          selectedImage = await ImagePicker.pickImage(
            source: source,
            imageQuality: 50,
            maxWidth: 400.0,
          );
      
          setState(() {
            _imageFile = selectedImage;
          });
        }
      

      为什么 var 起作用而 File 没有起作用没有意义,因为我们知道我们期望 File 作为返回值,但它现在运行良好。

      【讨论】:

      • 我认为问题在于您之前使用的 if 语句,因为条件没有任何意义。我还建议将 pickImage 替换为 getImage,阅读文档以获取帮助。文档中有一个专门用于此更新的部分pub.dev/packages/image_picker
      • 是的,你是对的,谢谢。我刚刚阅读了文档并找到了使用 getImage 的推荐方法。谢谢!
      猜你喜欢
      • 2021-05-29
      • 1970-01-01
      • 2019-11-14
      • 2021-03-02
      • 2021-03-22
      • 2021-11-25
      • 2019-07-26
      • 2019-02-04
      • 1970-01-01
      相关资源
      最近更新 更多