Dart 未来的建设者将制作条子列表
我试图从GET请求生成一个动态的碎片列表。但我遇到了问题,似乎响应数据为空。这是我的密码:Dart 未来的建设者将制作条子列表,dart,flutter,Dart,Flutter,我试图从GET请求生成一个动态的碎片列表。但我遇到了问题,似乎响应数据为空。这是我的密码: import 'package:flutter/material.dart'; import 'boardSummary.dart'; import 'package:http/http.dart' as http; import 'dart:convert'; import 'dart:async'; import 'package:flutter/foundation.dart'; class H
import 'package:flutter/material.dart';
import 'boardSummary.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
import 'dart:async';
import 'package:flutter/foundation.dart';
class HomepageBody extends StatefulWidget{
@override
State<StatefulWidget> createState() {
return HomepageBodyState();
}
}
class HomepageBodyState extends State <HomepageBody> {
@override
Widget build(BuildContext context) {
return new Expanded(
child: new Container(
color: new Color(0xFF736AB7),
child: new FutureBuilder <List<Post>>(
future: fetchPost(),
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.hasError) print(snapshot.error);
else
return jobscroll(context, snapshot);
//: Center(child: CircularProgressIndicator());
}
),
),
);
}
}
Future<List<Post>>fetchPost() async {
final response = await http.get('https://jsonplaceholder.typicode.com/posts?userId=1');
return compute(parsePosts, response.body);
}
List<Post> parsePosts(String responseBody){
final parsed = json.decode(responseBody).cast<Map<String, dynamic>>();
return parsed.map<Post>((json)=>Post.fromJson(json)).toList();
}
class Post {
final String userId;
final String hashtag;
final String price;
final String description;
Post({this.userId, this.hashtag, this.price, this.description});
factory Post.fromJson(Map<String, dynamic> json) {
return Post(
userId: json['userId'],
hashtag: json['id'],
price: json['title'],
description: json['body'],
);
}
}
Widget jobscroll(BuildContext context, AsyncSnapshot snapshot) {
List data = snapshot.data;
return CustomScrollView(
scrollDirection: Axis.vertical,
shrinkWrap: false,
slivers: <Widget>[new SliverPadding(
padding: const EdgeInsets.symmetric(vertical: 24.0),
sliver: new SliverList(
delegate: new SliverChildBuilderDelegate(
(context, index) => new BoardSummary(data[index]),
childCount: data.length,
),
),
),
],
);
}
编辑以下是我的松弛跟踪的前几行:
E/flutter (13964): type 'int' is not a subtype of type 'String'
E/flutter (13964): #0 new Post.fromJson (file:///home/daniel/Desktop/testapp/lib/ui/homePageBody.dart:76:19)
E/flutter (13964): #1 parsePosts.<anonymous closure> (file:///home/daniel/Desktop/testapp/lib/ui/homePageBody.dart:60:40)
E/flutter (13964): #2 MappedListIterable.elementAt (dart:_internal/iterable.dart:414:29)
E/flutter (13964): #3 ListIterable.toList (dart:_internal/iterable.dart:219:19)
E/flutter (13964): #4 parsePosts (file:///home/daniel/Desktop/testapp/lib/ui/homePageBody.dart:60:56)
E/flutter (13964): #5 _IsolateConfiguration.apply (package:flutter/src/foundation/isolates.dart:88:16)
E/flutter (13964): #6 _spawn.<anonymous closure> (package:flutter/src/foundation/isolates.dart:96:30)
FutureBuilder
即使值还不可用,也会立即生成,因为build()
是同步的,不能延迟
FutureBuilder
示例显示了如何检查该值是否已可用(默认值:…
而不是快照.hasError
):
new FutureBuilder(
future:_计算,//future或null
生成器:(BuildContext上下文,异步快照){
交换机(快照.连接状态){
case ConnectionState.none:返回新文本(“按下按钮开始”);
case ConnectionState.waiting:返回新文本('waiting result…');
违约:
if(snapshot.hasError)
返回新文本('Error:${snapshot.Error}');
其他的
返回新文本('Result:${snapshot.data}');
}
},
)
我仍然会遇到同样的错误,不知道为什么。我正在从Jsonplaceholder网站获取JSON。当ConnectionState
为none
或waiting
时,您不能使用数据。啊,我知道如果我去掉它,我只会得到一个空白屏幕(带有我的背景颜色),没有出现奇怪的数据。我从slack trace中添加了更多的信息,我认为int被视为字符串是个问题,不确定。正如我所说,数据到达需要一段时间。然后将再次调用生成器,并更改ConnectionState
。当ConnectionState
为none
或waiting
时,您可以显示微调器或类似的内容。谢谢,我也会添加微调器!我还可以通过将对象属性强制转换为字符串来解决这个问题。不确定这是否是一个好的解决方案,但目前它是有效的。
E/flutter (13964): type 'int' is not a subtype of type 'String'
E/flutter (13964): #0 new Post.fromJson (file:///home/daniel/Desktop/testapp/lib/ui/homePageBody.dart:76:19)
E/flutter (13964): #1 parsePosts.<anonymous closure> (file:///home/daniel/Desktop/testapp/lib/ui/homePageBody.dart:60:40)
E/flutter (13964): #2 MappedListIterable.elementAt (dart:_internal/iterable.dart:414:29)
E/flutter (13964): #3 ListIterable.toList (dart:_internal/iterable.dart:219:19)
E/flutter (13964): #4 parsePosts (file:///home/daniel/Desktop/testapp/lib/ui/homePageBody.dart:60:56)
E/flutter (13964): #5 _IsolateConfiguration.apply (package:flutter/src/foundation/isolates.dart:88:16)
E/flutter (13964): #6 _spawn.<anonymous closure> (package:flutter/src/foundation/isolates.dart:96:30)
return Post(
userId: json['userId'].toString(),
hashtag: json['id'].toString(),
price: json['title'].toString(),
description: json['body'].toString(),
);
new FutureBuilder<String>(
future: _calculation, // a Future<String> or null
builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.none: return new Text('Press button to start');
case ConnectionState.waiting: return new Text('Awaiting result...');
default:
if (snapshot.hasError)
return new Text('Error: ${snapshot.error}');
else
return new Text('Result: ${snapshot.data}');
}
},
)