Flutter:类型 'Future<dynamic>' 不是类型 'Future<Document>' 的子类型

Posted

技术标签:

【中文标题】Flutter:类型 \'Future<dynamic>\' 不是类型 \'Future<Document>\' 的子类型【英文标题】:Flutter: type 'Future<dynamic>' is not a subtype of type 'Future<Document>'Flutter:类型 'Future<dynamic>' 不是类型 'Future<Document>' 的子类型 【发布时间】:2021-02-10 04:56:19 【问题描述】:

我收到错误消息“'Future dynamic' 类型不是'Future Document' 类型的子类型”,并且无法弄清楚这个'Future dynamic' 来自哪里。

这里我尝试在 Flutter 中构建一个文档编辑页面,通过 id 从 API 加载文档,并在文档加载时使用 FutureBuilder 实际显示页面:

...

class _UpdateNotePageState extends State<UpdateNotePage> 
  final String id;
  DocumentBloc _bloc;
  Future<Document> document;

  _UpdateNotePageState(this.id) 
    _bloc = DocumentBloc();
    document = _bloc.getDocument(id);
  

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      body: FutureBuilder(
          future: document,
          builder: (BuildContext context, AsyncSnapshot<Document> snapshot) 
            if (snapshot.hasData) 
              return Container(
                child: Center(
                  child: Column(
                    children: <Widget>[
                      Text(id),
                      NoteForm(document: snapshot.data),
                    ],
                  ),
                ),
              );
            
            return new CircularProgressIndicator();
          ),
    );
  

这里是 getDocument() 代码(返回 Future Document):

...
class DocumentRepository 
...
  Future<Document> getDocument(String id) async 
    final response = await _api.get("documents/$id");
    return Document.fromJson(response);
  
...


class DocumentBloc 
...
  getDocument(String id) async 
    return await _documentRepository.getDocument(id);
  
...

这里是 Document.fromJson() 以防万一:

class Document 
...
  Document.fromJson(Map<String, dynamic> json) 
    id = json['id'];
    title = json['title'];
  
...

_api.get() 返回json.decode(response.body.toString())

为什么选择“未来动态”?我做错了什么?

【问题讨论】:

【参考方案1】:

我已经弄清楚了,这只是不同抽象级别上的同步/异步调用混乱,对 Future 的理解不足等。长话短说,我需要改变它

getDocument(String id) async 
  return await _documentRepository.getDocument(id);

到这里

Future<Document> getDocument(String id) async 
  return _documentRepository.getDocument(id);

然后按原样将此_bloc.getDocument(id) 传递给FutureBuilder

【讨论】:

【参考方案2】:

在您的类 DocumentRepository 中,在 getDocument 函数中,进行以下更改 (json.decode(response.body)):-

class DocumentRepository 
...
  Future<Document> getDocument(String id) async 
    final response = await _api.get("documents/$id");
    return Document.fromJson(json.decode(response.body));
  
...

【讨论】:

不相关。响应已经解码。我现在修改问题

以上是关于Flutter:类型 'Future<dynamic>' 不是类型 'Future<Document>' 的子类型的主要内容,如果未能解决你的问题,请参考以下文章

类型 'Future<dynamic>' 不是 Flutter 数据库创建中的“Future<int>”类型异常的子类型

Flutter'Future<void>'不是'Widget'类型的子类型[重复]

参数类型“Future<bool>”不能分配给参数类型“Widget”[Flutter]

Flutter:类型 'Future<dynamic>' 不是类型 'Widget' 的子类型 // MaterialPageRoute<dynamic>(null))

如何修复 Flutter 中的“参数类型 'Future<int>' 无法分配给参数类型 'int'”

Flutter:“Future<dynamic>”不是“String”类型的子类型