无效的参数:隔离消息中的参数非法:(对象是闭包-函数'createDataList':。)

Yud*_*tro 14 flutter

我尝试使用moviedb API从Internet上获取数据,我遵循了位于https://flutter.io/cookbook/networking/fetch-data/的教程

但出现以下错误。

无效的参数:隔离消息中的参数非法:(对象是闭包-函数'createDataList':。)

这是我的代码

Future<List<DataModel>> fetchData() async{
    final response = await http.get("https://api.themoviedb.org/3/movie/now_playing?api_key=d81172160acd9daaf6e477f2b306e423&language=en-US");

    if(response.statusCode == 200){

      return compute(createDataList,response.body.toString());
    }
  }

  List<DataModel> createDataList(String responFroJson) {
    final parse  = json.decode(responFroJson).cast<Map<String, dynamic>>();

    return parse.map<DataModel> ((json) => DataModel.fromtJson(json)).toList();
  }
Run Code Online (Sandbox Code Playgroud)

错误消息的屏幕截图 在此处输入图片说明

Gün*_*uer 23

compute 只能使用顶级功能,而不能使用实例或静态方法。

顶级函数是声明为不在类内部且不在另一个函数内的函数

List<DataModel> createDataList(String responFroJson) {
...
}

class SomeClass { ... }
Run Code Online (Sandbox Code Playgroud)

应该修复它。

https://docs.flutter.io/flutter/foundation/compute.html

R是返回值的类型。callback参数必须是顶级函数,而不是类的闭包,实例或静态方法。

  • @NimishDavidMathew 你评论的目的是什么? (2认同)

Bot*_*acz 7

根据今天(2020 年 8 月),计算在静态方法下运行良好。对我来说,问题是我试图http.Response从 compute() 方法返回一个对象。

我所做的是创建了此类的简化版本,其中包含我需要的内容:

class SimpleHttpResponse {
  String body;
  int statusCode;
  Map<String, String> headers;
}
Run Code Online (Sandbox Code Playgroud)

然后我从这里更新了原始方法:

static Future<http.Response> _executePostRequest(EsBridge bridge) async {
    return await http.post(Settings.bridgeUrl, body: bridge.toEncryptedMessage());
}
 
Run Code Online (Sandbox Code Playgroud)

对此:

static Future<SimpleHttpResponse> _executePostRequest(EsBridge bridge) async {
    http.Response result = await http.post(Settings.bridgeUrl, body: bridge.toEncryptedMessage());
    if (result == null) {
      return null;
    }

    SimpleHttpResponse shr = new SimpleHttpResponse();
    shr.body = result.body;
    shr.headers = result.headers;
    shr.statusCode = result.statusCode;

    return shr;
}
Run Code Online (Sandbox Code Playgroud)

在此更改后,它的工作就像魅力一样。希望这可以帮助遇到类似问题的人。

  • 截至 2021 年 6 月,一切顺利。我想提一下 [link](https://api.dart.dev/stable/2.6.0/dart-isolate/SendPort/send.html) 上的文档需要更新。它说只有原始类型可以在隔离之间传递。这不是真的。您可以在隔离之间发送和接收自定义类型。但我只在传递来自其他包的类型时遇到错误。您的本地类型将起作用。 (3认同)