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的坑,意思是說,這個接口不用填寫這個類型,去掉即可。
發佈了79 篇原創文章 · 獲贊 45 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章