【发布时间】:2022-11-03 13:18:37
【问题描述】:
我已经使用flutter_uploader 3.0.0-beta.4包,我让它像在 iOS 上宣传的那样工作,但无法在 Android 上返回的侦听器结果中获得任何响应数据。
我按照开发人员指南调整了 AndroidManifest.xml 文件,但这些设置不断使 Android 应用程序构建崩溃,抱怨双启动 WorkManager。 我什至可以为 Android 构建应用程序的唯一方法是在 AndroidManifest 文件中使用以下设置:
<application
...
all default flutter generated settings here
...
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
android:enabled="false"
tools:node="merge">
<!-- If you are using androidx.startup to initialize other components -->
<meta-data
android:name="androidx.work.WorkManagerInitializer"
android:value="androidx.startup"
android:enabled="false"
android:exported="false"
tools:node="remove" />
</provider>
<provider
android:name="com.bluechilli.flutteruploader.FlutterUploaderInitializer"
android:authorities="${applicationId}.flutter-uploader-init"
android:exported="false">
<meta-data
android:name="com.bluechilli.flutteruploader.MAX_CONCURRENT_TASKS"
android:value="3" />
<meta-data
android:name="com.bluechilli.flutteruploader.UPLOAD_CONNECTION_TIMEOUT_IN_SECONDS"
android:value="3600" />
</provider>
</application>
然后在颤振我入队()带有文件和一些额外数据对象的 MultipartFormDataUpload() 块,所有这些都发送到 PHP 并按预期到达,文件上传,所有数据都在 PHP 脚本中,然后服务器端脚本发回一个 jsonEncoded 对象,在 iOS 上,此 json 对象返回到侦听器 result.response 数据中,但在 Android 上,响应数据部分永远不会填充。
// UPLOAD IMAGE FILE
queuedPhoto.uploadTaskId = await _uploaderService.enqueue(
MultipartFormDataUpload(
url: _httpService.url(EndPoint.uploadPhoto).toString(),
files: [FileItem(path: filePath, field: "fileToUpload")],
method: UploadMethod.POST,
headers: {
'Authorization': 'Bearer $token',
},
data: {
"groupPath": groupPath,
"clientId": '${queuedPhoto.clientId}',
"projectId": '${queuedPhoto.projectId}',
"mapId": '${queuedPhoto.mapId}',
"groupId": '${queuedPhoto.groupId}',
"userId": '${queuedPhoto.userId}',
"dateCreated": '${queuedPhoto.dateCreated}',
"filepath": queuedPhoto.filename,
"type": queuedPhoto.type,
"thumbpath": queuedPhoto.thumbnail,
"note": queuedPhoto.note,
"lat": queuedPhoto.lat,
"lon": queuedPhoto.lon,
"dir": '${queuedPhoto.dir}',
"tags": queuedPhoto.tags.map((t) => t.name).whereNotNull().toList().join(','),
"subtags": queuedPhoto.tags
.map((t) => t.subtag != null ? '${t.subtag?.tagName}_${t.subtag?.name}' : null)
.whereNotNull()
.toList()
.join(','),
"appVersion": queuedPhoto.appVersion,
"gpsAccuracy": '${queuedPhoto.gpsAccuracy}',
},
tag: filename,
),
);
_uploaderService.progress.listen((progress) {
if (queuedPhoto.uploadTaskId == progress.taskId) {
queuedPhoto.uploadProgress = progress.progress;
}
uploadProgressSubject$.add(progress.progress ?? 0);
});
_uploaderService.result.listen((result) {
if (queuedPhoto.uploadTaskId == result.taskId && queuedPhoto.uploadProgress == 100) {
completedUpload(result);
}
}, onError: (ex, stacktrace) {
errorUpload();
});
进度监听器按预期工作,结果监听器也得到结果调用(在上传期间多次使用不相关的 taskId,应该有这么多不相关的流结果吗??),通过监听器的最终结果是正确的taskId 和所有结果对象似乎都是正确的,除了没有 result.response 对象,它始终保持为空,在上面的侦听器中,我添加了一个上传进度检查以尝试将结果流限制为仅最终结果(我也检查了所有其他看似无关的任务 ID 的结果,但对于每个任务 ID,响应数据始终为空)。
我是否应该将任何设置更改为 Android 配置文件,或者服务器端 PHP 脚本是否应该以特定格式返回 json 数据?
我无法弄清楚这一点,因为 iOS 一切正常,而在 Android 上,所有其他服务器端数据 GET 和 POST 调用工作正常,并返回由 Android/Flutter 正确接收和解码的 json 编码数据。
【问题讨论】: