无法让未来的构建器显示我的 JSON 数据



我正在尝试提取JSON数据,并在未来的生成器和列表视图中显示一些信息。未来的构建器正在填充数据,但一旦到达listview检查长度的步骤,它就会失败。

端点:https://jsonplaceholder.typicode.com/posts

我使用的是一个公共端点,这里是我的代码:

Main:

import 'package:flutter/material.dart';
import 'package:fresh_project/screens/homepage.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const Homepage(),
);
}
}

主页(加载数据的地方(

import 'package:flutter/material.dart';
import 'package:fresh_project/models/user.dart';
import 'package:fresh_project/network/users_repo.dart';
class Homepage extends StatefulWidget {
const Homepage({Key? key}) : super(key: key);
@override
State<Homepage> createState() => _HomepageState();
}
class _HomepageState extends State<Homepage> {
late Future<List<User>?>? listOfUsers;
final UsersRepo _userRepo = UsersRepo();
@override
void initState() {
super.initState();
listOfUsers = _userRepo.fetchUsers();
}
@override
Widget build(BuildContext context) {
return FutureBuilder<List<User>?>(
future: listOfUsers,
builder: (context, snapshot) {
if (snapshot.hasData) {
ListView.builder(
itemCount: snapshot.data!.length,
itemBuilder: (context, index) {
return Padding(
padding: const EdgeInsets.symmetric(vertical: 1, horizontal: 4),
child: Text(
snapshot.data![index].title!,
),
);
},
);
} else if (snapshot.hasError) {
print('Failed to load users');
}
return const Center(
child: SizedBox(
width: 200,
height: 200,
child: CircularProgressIndicator(),
),
);
},
);
}
}

回购:

import 'dart:convert';
import 'package:fresh_project/constants/api_constants.dart';
import 'package:http/http.dart' as http;
import 'package:fresh_project/models/user.dart';
class UsersRepo{
Future<List<User>?> fetchUsers() async {
try{
final response = await http.get(Uri.parse(ApiConstants.url + ApiConstants.endpoint));
if(response.statusCode == 200){
return returnUsers(response.body);
}
} catch(e){
// ignore: avoid_print
print(e.toString());
}
}
}
List<User> returnUsers(String json){
List<User> tempList = [];
var decodedJson = jsonDecode(json);
for(var instance in decodedJson){
tempList.add(User.fromJson(instance));
}
return tempList;
}

型号:

class User {
final int? userId;
final int? id;
final String? title;
final String? body;
User(this.userId, this.id, this.title, this.body);
factory User.fromJson(Map<String, dynamic> json) {
return User(
json['userId'],
json['id'],
json['title'],
json['body'],
);
}
}

检查快照的连接状态,并在请求运行时返回进度指示器。

尝试像这样重新组织FutureBuilder

@override
Widget build(BuildContext context) {
return FutureBuilder<List<User>?>(
future: listOfUsers,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const Center(
child: SizedBox(
width: 200,
height: 200,
child: CircularProgressIndicator(),
),
);
}
if (snapshot.hasData) {
return ListView.builder(
itemCount: snapshot.data!.length,
itemBuilder: (context, index) {
return Padding(
padding: const EdgeInsets.symmetric(vertical: 1, horizontal: 4),
child: Text(
snapshot.data![index].title!,
),
);
},
);
} else {
return const Center(child: Text('Error'));
}
},
);
}

如果需要,您也可以检查snapshot.hasError

最新更新