0

这是代码,我使用 image_picker 来显示相机或画廊图像。在主函数中另外使用 .dart 文件,我在 RunApp() 下运行此代码。

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:modal_progress_hud/modal_progress_hud.dart';
class Display_Image extends StatefulWidget {
  @override
  _Display_ImageState createState() => _Display_ImageState();
}

class _Display_ImageState extends State<Display_Image> {
  File _image;
  void ImageGrab(int i)
  async {
    setState(() {
      ShowSpinner=true;
    });
    try
    {
      if(i==1) {
        File gallerfile = await ImagePicker.pickImage(
            source: ImageSource.gallery);
        _image=gallerfile;
        setState(() {
          ShowSpinner=false;
        });
      }
      else {
        File gallerfile = await ImagePicker.pickImage(
            source: ImageSource.camera);
        _image=gallerfile;

      setState(() {
        ShowSpinner=false;
      });}
      //print('Selected image path: ${gallerfile.path}');

    }
    catch(e)
    {
      print(e);
    }

  }
  bool ShowSpinner=false;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Image Picker Test'),
      ),
      //backgroundColor: Colors.deepPurpleAccent,
      body: ModalProgressHUD(
        inAsyncCall: ShowSpinner,
        child: Column(
          children: <Widget>[
            //SizedBox(height: 10,),
            Container(
              color: Colors.deepPurpleAccent,
              height: 50,
              child: Row(
                children: <Widget>[
                  SizedBox(width: 20,),
                  FlatButton(
                    child: Icon(Icons.camera),
                    onPressed: (){
                      ImageGrab(0);
                    },
                  ),
                  SizedBox(width: 120,),
                  FlatButton(
                    child: Icon(Icons.image),
                    onPressed: (){
                      ImageGrab(1);
                    },
                  ),
                  SizedBox(width: 20,)
                ],
              ),
            ),
            //SizedBox(height: 10,),
            Expanded(
              child:Container(
                width: double.infinity,
                child: _image==null?Text('Image Appears here'):Image.file(_image),
                color: Colors.greenAccent,
              ),
            ),
          ],
        ),
      ),
    );
  }
}

这是用户界面图像:

在此处输入图像描述

现在我面临的两个问题是:1.当我使用相机按钮显示相机图像时,相机UI打开,我捕获图像,按下检查按钮,UI继续加载但图像不显示。2. 当我重新启动应用程序并重新运行它时,UI 再次继续加载,即使我按下画廊按钮(当我从头开始运行应用程序时效果很好),它也会在控制台中显示一条消息说:

I/flutter (14072): PlatformException(already_active, Image picker is already active, null)

请注意,这只发生在遇到我提到的第二种情况时。此外,我使用的是版本号image_picker: ^0.5.4+1,因为我使用的是 firebase 的 mlkit 库,如果我使用 image_picker 的新版本,则会引发一个带有大量消息的巨大错误。

请调查一下,让我知道如何进一步处理。提前致谢。

4

1 回答 1

-2

所以我在这里解决了这个问题。要确保的要点是:

  1. image_picker 的版本必须是最新的更新版本。
  2. 执行相同操作时可能会出现 Android-X 兼容性错误。这些错误出现在此GitHub 链接中。

要解决问题 2,您需要进行一些非常重要的更改,据我所知,您只能通过执行以下更改来做到这一点:

步骤 1. 进入 android 文件夹下的 gradle.properties,并添加以下代码:

org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true
android.enableJetifier=true

步骤 2. 现在转到 android 下的 build.gradle,而不是 app->build.gradle 下。在查看文件时,确保它以单词 builscript 开头(通过这种方式,您可以确保您位于正确的 build.gradle 文件中。)

第 3 步。 Ctrl+A 该文件中的所有内容,注意 ctrl+A 删除所有内容所需的所有内容并粘贴这段代码:

buildscript {
    ext.kotlin_version = '1.3.0'
    repositories {
        google()
        jcenter()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:3.3.1'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath 'com.google.gms:google-services:4.2.0'
    }

    subprojects {
        project.configurations.all {
            resolutionStrategy.eachDependency { details ->
                if (details.requested.group == 'com.android.support'
                        && !details.requested.name.contains('multidex') ) {
                    details.useVersion "27.1.1"
                }

                if (details.requested.group == 'androidx.core'
                        && !details.requested.name.contains('androidx') ) {
                    details.useVersion "1.0.1"
                }
            }
        }
    }

}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

rootProject.buildDir = '../build'
subprojects {
    project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
    project.evaluationDependsOn(':app')
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

需要注意的一个非常重要的一点是,在编译过程中,您很可能会看到此警告消息以完全红色显示。在得出任何结论之前,请不要害怕,让整个编译完成。虽然它是红色的,但它不会停止您的编译,因为您会在底部看到一个显示编译进度的旋转圆圈。在那之后,它会消失,您将能够运行该应用程序。这是警告消息:

注意:C:\flutter.pub-cache\hosted\pub.dartlang.org\cloud_firestore-0.12.11\android\src\main\java\io\flutter\plugins\firebase\cloudfirestore\CloudFirestorePlugin.java 使用或覆盖一个已弃用的 API。注意:使用 -Xlint:deprecation 重新编译以获取详细信息。注意:C:\flutter.pub-cache\hosted\pub.dartlang.org\cloud_firestore-0.12.11\android\src\main\java\io\flutter\plugins\firebase\cloudfirestore\CloudFirestorePlugin.java 使用 unchecked 或 unsafe操作。注意:使用 -Xlint:unchecked 重新编译以获取详细信息。错误:[TAG] 无法解析变量 '${animal.sniffer.version}' 注意:C:\flutter.pub-cache\hosted\pub.dartlang.org\mlkit-0.15.0\android\src\main\ java\com\azihsoyn\flutter\mlkit\MlkitPlugin.java 使用未经检查或不安全的操作。注意:使用 -Xlint:unchecked 重新编译以获取详细信息。

和繁荣!而已。相信我,这绝对可以解决您的问题。

如果您仍然遇到任何此类问题,请尝试实施此链接中提到的其他一些解决方案。

于 2019-12-07T06:31:55.653 回答