flutter 若干小坑及其解决方式

  1. down下来的工程运行正常,放到自己的工程里就不不正常了,比如qrscanpick_image
    flutter工程所添加在pubspec.yaml的依赖,要么是dart语言所编写的插件,要么就是和原生交互的插件;像qrscanpick_image就是和原生交互的插件;碰到一个问题就是,添加依赖成功后,执行功能时,从logcat中,发现日志明显是有结果或者走到一半就没有下文了,也不报错…
    进入对应插件库里,你会发现,像前面两者的Plugin类中都调用了activity.startActivityForResult(intent, REQUEST_IMAGE);方法,那么就意味着会有onActivityResult(int requestCode, int resultCode, Intent data)方法。添加的插件都是通过GeneratedPluginRegistrant.registerWith(this);依附到MainActivity,意思是说,如果MainActivity覆写了onActivityResult方法,那么他们在Plugin类中添加的onActivityResult将不会被触发。
    解决方法:1.不要在MainActivity覆写了onActivityResult方法;2.把插件直接copy下来放到工程里,把Plugin类中的onActivityResult方法里的内容迁移到MainActivity中的onActivityResult方法中,即可呈现。

  2. 获取图片ID,得到的是Uricontent://media/...,那么怎么获取绝对路径,进行取图片上传呢?
    首先呢,flutter本身不能够直接从Uri获取图片路径,起码,目前没有。所以呢,我选择和Android原生交互。
    Android原生:

private static final String URI_PATH_CHANNEL = "acesmart.flutter.io/uritopath";
//方法
 new MethodChannel(getFlutterView(), URI_PATH_CHANNEL).setMethodCallHandler(
                new MethodChannel.MethodCallHandler() {
                    @Override
                    public void onMethodCall(MethodCall methodCall, MethodChannel.Result result) {
                        MainActivity.this.result = result;
                        String count = methodCall.arguments();
                        System.out.println("uri:"+count);
                        if (count !=null){
                            Uri uri=Uri.parse(count);
                            if (methodCall.method.equals("getUriPath")) {
                            getFilePath(uri);
                        } else {
                            result.notImplemented();
                        }
                        }

                    }
                }
        );
        private void getFilePath(Uri uri) {
        String filePathByUri = FileUtils.getFilePathByUri(MainActivity.this, uri);
        System.out.println("getFilePath:"+filePathByUri);
         result.success(filePathByUri);
    }
//其中,FileUtils.getFilePathByUri(MainActivity.this, uri);方法是
// 以 content:// 开头的,比如 content://media/extenral/images/media/17766
        if (ContentResolver.SCHEME_CONTENT.equals(uri.getScheme()) && uri.toString().startsWith("content://media")) {

            Cursor cursor = context.getContentResolver().query(uri, new String[]{MediaStore.Images.Media.DATA}, null, null, null);
            if (cursor != null) {
                if (cursor.moveToFirst()) {
                    int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                    if (columnIndex > -1) {
                        path = cursor.getString(columnIndex);
                    }
                }
                cursor.close();
            }
            return path;
        }

flutter端:

static const MethodChannel _methodChannel = MethodChannel('acesmart.flutter.io/uritopath');

//方法
 final String   uriPath = await _methodChannel.invokeMethod("getUriPath", “你的uri”);

如果,这块不懂的话,可以参考Flutter与原生交互

  1. the request was rejected because no multipart boundary was found
    在做dio头像上传时,根据后台contextType类型,写了"Content-Type: multipart/form-data",上面报的错算是springMVC的坑,意思是说,这个接口不用填写这个类型,去掉即可。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值