Flutter中向GET请求传递参数报错,求解决方法
Flutter GET请求传参及解析问题修复
参数拼接优化
手动拼接URL参数容易出现编码问题,建议用更规范的方式生成Uri:
// 替换原有get请求的Uri生成代码 Response response = await get( Uri.parse(endpoint).replace(queryParameters: {'username': username}) );
这种方式会自动处理参数的URL编码,避免特殊字符导致的请求错误。
响应解析错误(核心问题)
你当前的解析逻辑把接口返回的JSON包在了额外的数组里:
final List result = [jsonDecode(response.body)];
如果后端返回的本身是数组格式的响应(比如[{"mood":"开心",...}, {...}]),这样处理后会得到一个嵌套数组[[...]],导致JournalResponseModel.fromJson无法正确解析(因为它期望单个对象的Map,而非数组)。
修复后的解析逻辑:
if (response.statusCode == 200) { final List result = jsonDecode(response.body); print(response.body); return result.map((e) => JournalResponseModel.fromJson(e)).toList(); }
如果后端返回的是带包裹的对象(比如{"list": [...], "code": 200}),则需要先提取对应的数组字段:
final Map<String, dynamic> resMap = jsonDecode(response.body); final List result = resMap['list']; // 替换成实际的字段名
FutureBuilder重复请求问题
直接在future参数中调用GetJournalService().getArticles('jack'),会导致Widget每次重建时都发起新请求,造成资源浪费和异常。
修复方式:将Future对象提前初始化并存储:
// 在State类中定义变量 late Future<List<JournalResponseModel>> _journalFuture; @override void initState() { super.initState(); // 在initState中初始化请求 _journalFuture = GetJournalService().getArticles('jack'); } // 使用存储的Future对象 FutureBuilder<List<JournalResponseModel>>( future: _journalFuture, builder: (context, snapshot) { if (snapshot.hasData) { return ListView.builder( shrinkWrap: true, itemCount: snapshot.data!.length, itemBuilder: (context, index) { final journal = snapshot.data![index]; return EntryWidget( backgroundColor: AppColors.blue, icon: Icons.remove, mood: journal.mood!, date: journal.createdAt!, ); }, ); } else if (snapshot.hasError) { return Text('${snapshot.error}'); } return CircularProgressIndicator(); }, )
内容的提问来源于stack exchange,提问作者Homerunner
相关产品推荐
相关产品推荐

