Flutter <;未来>;fetch调用返回';片段';

Flutter <;未来>;fetch调用返回';片段';,flutter,dart,Flutter,Dart,我试着遵循Flutter文档中的Future builder小部件指南 但是,当我调用fetch并尝试显示信息时,我得到了“Snippet”的实例 我注意到,当我编写jsonDecode(res.body)时,它正确地显示了响应的JSON,但在我运行Snippet.fromJson并返回它之后,当我得到“Snippet”的实例时 下面是我创建类的代码,下面是我调用它的代码 import 'dart:convert'; import 'package:flutter/foundation.dar

我试着遵循Flutter文档中的Future builder小部件指南

但是,当我调用fetch并尝试显示信息时,我得到了“Snippet”的实例

我注意到,当我编写jsonDecode(res.body)时,它正确地显示了响应的JSON,但在我运行Snippet.fromJson并返回它之后,当我得到“Snippet”的实例时

下面是我创建类的代码,下面是我调用它的代码

import 'dart:convert';

import 'package:flutter/foundation.dart';
import 'package:http/http.dart' as http;

class SnippetProvider extends ChangeNotifier {
  final String snippetUrl = 'https://endpoint';

  Future<Snippet> getSnippets() async {
    final res = await http.get(snippetUrl);
    if (res.statusCode == 200) {
      debugPrint('data: ${jsonDecode(res.body}'); //correct info 
      return Snippet.fromJson(jsonDecode(res.body));
    } else {
      throw "No snippets available";
    }
  }
}

class Snippet {
  final int book;
  final String title;
  final String list;
  final String body;

  Snippet({this.book, this.title, this.list, this.body});

  factory Snippet.fromJson(Map<String, dynamic> json) {
    return Snippet(
      book: json['book'] as int,
      title: json['title'] as String,
      list: json['list'] as String,
      body: json['body'] as String,
    );
  }
}
导入'dart:convert';
进口“包装:颤振/基础.dart”;
将“package:http/http.dart”导入为http;
类SnippetProvider扩展了ChangeNotifier{
最后一个字符串片段URL=https://endpoint';
将来的getSnippets()异步{
final res=wait http.get(snippetUrl);
如果(res.statusCode==200){
debugPrint('data:${jsonDecode(res.body}');//正确的信息
返回Snippet.fromJson(jsonDecode(res.body));
}否则{
抛出“没有可用的代码段”;
}
}
}
类片段{
最后一本书;
最后的字符串标题;
最终字符串列表;
最终管柱体;
代码段({this.book,this.title,this.list,this.body});
工厂代码片段.fromJson(映射json){
返回代码段(
book:json['book']作为int,
title:json['title']作为字符串,
list:json['list']作为字符串,
body:json['body']作为字符串,
);
}
}
class\u共享状态扩展状态{
未来片段;
未来,未来;;
var checkboxStatus=false;
风险价值与共享;
final SnippetProvider方法=新建SnippetProvider();
@凌驾
void initState(){
snippetsToBeShared=新列表();
super.initState();
snippets=pdfSnippets();
}
未来的pdfSnippets()异步{
final data=await method.getSnippets();
debugPrint('data:$data');
//!此代码将中断应用程序
//数据是具有嵌套对象的对象
//设置状态(()=>{
//processedSnippets.add(数据),
//processedSnippets[0]
//.map((snippet)=>processedSnippets.add(snippet))
//     });
返回数据;
}
孩子:未来建设者(
未来:片段,
生成器:(BuildContext上下文,异步快照){
if(snapshot.hasData){
返回ListView.builder(
//*必须用溢出隐藏ECESS代码段
//?并有一个最大宽度以适合尾随复选框
itemBuilder:(构建上下文,int索引){
返回列表块(
标题:文本(“${snapshot.data.body}”),
字幕:文本(“${snapshot.data.title}”),
[...]
)

jsonDecode解析字符串并返回生成的Json对象。因此,您可以在调试控制台中看到解析后的Json对象。然后使用fromJson(jsonDecode(res.body))构造截断的对象,
你得到的是真正的代码片段,而不是Json对象。你得到的是“实例”代码片段。

你能提供一个请吗?我看到很多被注释掉的代码,另一方面我看到你遗漏了你拥有的代码。如果我们看到的不是你运行的代码,很难说有什么不对。打印
代码片段
调用
。toString()
Snippet
上,但
Snippet
类没有
toString()
重写。您希望看到什么?如果希望它打印JSON,则需要添加
toString()
重写并自己做。啊,我明白了,那么我应该从
SnippetProvider
类中的
getSnippets
函数返回什么,以便使用该数据通过ListTile小部件显示它呢?啊,我明白了,那么我如何让Snippet.fromJson返回一个对象而不是一个实例呢nds声明您应该创建一个snipped line snaped createdSnipped=new snaped();然后使用getSnippets()获取值。然后((value)=>createdSnipped=value);
class _ShareState extends State<Share> {
  Future<Snippet> snippets;
  Future<Snippet> _future;
  var checkboxStatus = false;
  var snippetsToBeShared;
  final SnippetProvider method = new SnippetProvider();

  @override
  void initState() {
    snippetsToBeShared = new List();
    super.initState();
    snippets = pdfSnippets();
  }

  Future<Snippet> pdfSnippets() async {
    final data = await method.getSnippets();
    debugPrint('data: $data');
    //! this code breaks the app
    // data is an obj with nested objs
    // setState(() => {
    //       processedSnippets.add(data),
    //       processedSnippets[0]
    //           .map((snippet) => processedSnippets.add(snippet))
    //     });
    return data;
  }
        child: FutureBuilder<Snippet>(
          future: snippets,
          builder: (BuildContext context, AsyncSnapshot snapshot) {
            if (snapshot.hasData) {
              return ListView.builder(
                  //* will have to hide the eccess snippet with overflow
                  //? and have a max width to fit the trailing checkbox
                  itemBuilder: (BuildContext context, int index) {
                return ListTile(
                  title: Text('${snapshot.data.body}'),
                  subtitle: Text('${snapshot.data.title}'),
                  [...]
)