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