我有一个Flutter 应用程序,在其中我通常使用http请求从模型到Go API的请求发布,如下所示.
if (dateRequired != null) {
data['date_required'] = dateRequired?.formatDbDate();
} else {
data['date_required'] = null;
}
然而,我想同时上传文件和解码json数据.上传文件如下所示,但我从下面的代码中得到的结果是
或者(null)
,它会在我的API中抛出一个解码错误.我原以为是{"date_required": null}
或{"date_required": 2023-11-12}
.
我怎么才能到那里呢?我注意到DART http使用Map<String, dynamic>
,而DART MultipartRequest
使用Map<String, String>
,所以我可以使用NULL.这将需要在我的Go API中进一步解析.
Future<dynamic> uploadFile(
BuildContext context, User user, String dateRequiredString) async {
final navigator = Navigator.of(context);
const storage = FlutterSecureStorage();
String? token = await storage.read(key: 'jwt');
Map<String, String> headers = {
"Authorization": "Bearer $token",
};
final bytes = file?.bytes;
if (file == null || bytes == null) return;
final multipartFile =
http.MultipartFile.fromBytes('file', bytes, filename: file?.name);
final request = http.MultipartRequest('POST', Uri.parse(user.fileUrl));
request.files.add(multipartFile);
request.headers.addAll(headers);
request.fields['date_required'] = dateRequiredString;
生成字段的DART代码,根据@mandy8055的答案进行编辑.
if (_formKey.currentState!.validate()) {
if (_formKey
.currentState
?.fields['date_required']
?.value !=
null) {
dateRequired = _formKey.currentState
?.fields['date_required']!.value;
}
Map<String, dynamic> data = {
'date_required': dateRequired != null
? dateRequired!.formatDbDate()
: null
};
print(data);
Map<String, String> dateRequiredString =
jsonEncode(data)
as Map<String, String>;
print(dateRequiredString);
这将产生以下控制台输出
{date_required: null}
Error: Expected a value of type 'Map<String, String>', but got one of type 'String'
进一步编辑:
_formKey.currentState?.save();
if (_formKey.currentState!.validate()) {
if (_formKey
.currentState
?.fields['date_required']
?.value !=
null) {
dateRequired = _formKey.currentState
?.fields['date_required']!.value;
}
Map<String, dynamic> data = {
'date_required': dateRequired != null
? dateRequired!.formatDbDate()
: null
};
String jsonString = jsonEncode(data);
Map<String, dynamic> decodedMap =
jsonDecode(jsonString);
Map<String, String> dateRequiredString =
decodedMap.cast<String, String>();
print(data);
print(dateRequiredString);
uploadFile(
context, user, dateRequiredString);
}
这将抛出下面的错误(这里的日期应该为空).我看到 keys 没有被引用,但我认为它应该被引用.
{date_required: null}
Error: Expected a value of type 'String', but got one of type 'Null'
以下是演示该问题的一些工作代码.我需要将Map<String, dynamic>
转换为Map<String, String>
,并保留"DATE_REQUIRED"键周围的引号.
import 'dart:convert';
void main() {
Map<String, dynamic> data = {'date_required': null};
print(data);
String jsonString = jsonEncode(data);
print(jsonString);
Map<String, dynamic> decodedMap = jsonDecode(jsonString);
print(decodedMap);
Map<String, String> dateRequiredString = decodedMap.cast<String, String>();
print(dateRequiredString);
}
控制台输出:
{date_required: null}
{"date_required":null}
{date_required: null}
: TypeError: null: type 'JSNull' is not a subtype of type 'String'Error: TypeError: null: type 'JSNull' is not a subtype of type 'String'