Flutter调用http.get的then方法报函数表达式不能命名错误解决方法
错误原因
- 触发
Function expressions can't be named: then报错的直接原因是括号书写错位:原代码中.then((response)) {的写法,在(response)后多写了一个右括号,导致Dart语法解析器判定then方法的调用已经提前结束,后面跟随的{ ... }代码块被识别为名为then的函数表达式,而Dart语法不允许为匿名函数表达式命名,直接抛出语法错误。 - 代码中还存在几个新手常犯的问题,修正时可以一并处理:
- 已经使用
await处理异步逻辑的前提下,不需要额外链式调用then,两种异步写法混用极易出现语法错误,也会降低代码可读性 response.body是字符串类型,无法直接通过['status']读取字段,必须先通过jsonDecode将字符串解析为Map结构后才能取属性- 方法参数中未定义
callback,直接调用会触发未定义方法报错;代码末尾存在错位多余的大括号,会触发括号不匹配错误 - 未判断HTTP请求状态码,请求失败时直接解析响应体大概率会触发解码异常
- 已经使用
修正方案
优先使用async/await写法,逻辑更直观适合新手,修正后可正常运行的代码如下:
import 'dart:convert'; import 'package:http/http.dart' as http; // 记得在方法参数中定义传入的callback回调 void submitForm(FeedbackForm feedbackForm, Function callback) async { try { // 发起异步get请求,await等待结果,不需要套then final response = await http.get(Uri.parse(URL + feedbackForm.toParams())); // 先校验请求状态码为200(成功)再处理响应 if (response.statusCode == 200) { // 先将响应体字符串解码为Map结构,再读取status字段 final responseData = jsonDecode(response.body); callback(responseData['status']); } else { print("请求异常,状态码:${response.statusCode}"); } } catch (e) { print(e); } }
如果坚持使用then链式写法,注意不要搭配await,且要保证括号位置正确,写法参考如下(不推荐新手使用):
import 'dart:convert'; import 'package:http/http.dart' as http; void submitForm(FeedbackForm feedbackForm, Function callback) { http.get(Uri.parse(URL + feedbackForm.toParams())) .then((response) { if (response.statusCode == 200) { final responseData = jsonDecode(response.body); callback(responseData['status']); } }) .catchError((e) { print(e); }); }
内容的提问来源于stack exchange,提问作者Rob
相关产品推荐
相关产品推荐

