-
down下來的工程運行正常,放到自己的工程裏就不不正常了,比如
qrscan
和pick_image
flutter工程所添加在pubspec.yaml
的依賴,要麼是dart語言所編寫的插件,要麼就是和原生交互的插件;像qrscan和pick_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方法中,即可呈現。 -
獲取圖片ID,得到的是Uri
content://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與原生交互
- the request was rejected because no multipart boundary was found
在做dio頭像上傳時,根據後臺contextType
類型,寫了"Content-Type: multipart/form-data"
,上面報的錯算是springMVC的坑,意思是說,這個接口不用填寫這個類型,去掉即可。