Flutter中JSON逻辑无响应 无法拉取HTTP接口数据问题求助
问题排查与修复方案
你代码存在3处核心错误导致逻辑无法运行:
- 未导入
dart:convert库,jsonDecode方法无法识别,直接触发编译/运行错误 User类构造参数顺序与传参不匹配:User类定义的构造参数顺序为(int id, String name, String username),但你调用时传的参数是(u['name'], u['email'], u['username']),不仅缺少必填的int类型id参数,还错误传入了不需要的email字段,参数类型、顺序、数量全部不匹配- 没有处理网络请求的异常状态,接口请求失败时会直接崩溃
修正后完整可运行代码
import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; // 新增导入json解析所需依赖 import 'dart:convert'; class Datafromapi extends StatefulWidget { const Datafromapi({Key? key}) : super(key: key); @override _DatafromapiState createState() => _DatafromapiState(); } class _DatafromapiState extends State<Datafromapi> { Future<List<User>> getUserData() async { try { var response = await http.get(Uri.https('jsonplaceholder.typicode.com', 'users')); // 先判断接口请求是否成功 if (response.statusCode == 200) { var jsonData = jsonDecode(response.body); List<User> users = []; for (var u in jsonData) { // 修正参数顺序,传入id、name、username三个匹配的参数 User user = User(u['id'], u['name'], u['username']); users.add(user); } return users; } else { return []; } } catch (e) { print('请求出错:$e'); return []; } } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('json获取数据'), ), body: Container( // 给FutureBuilder指定泛型,提升类型安全性 child: FutureBuilder<List<User>>( future: getUserData(), builder: (BuildContext context, AsyncSnapshot<List<User>> snapshot) { // 先判断加载状态 if (snapshot.connectionState == ConnectionState.waiting) { return const Center(child: Text('加载中....')); } // 判断是否有错误 if (snapshot.hasError) { return Center(child: Text('加载失败:${snapshot.error}')); } // 数据为空的情况 if (!snapshot.hasData || snapshot.data!.isEmpty) { return const Center(child: Text('暂无数据')); } return ListView.builder( itemCount: snapshot.data!.length, itemBuilder: (BuildContext context, index) { return ListTile( title: Text(snapshot.data![index].name), subtitle: Text(snapshot.data![index].username), ); } ); } ), ), ); } } class User { final int id; final String name; final String username; User(this.id, this.name, this.username); }
内容的提问来源于stack exchange,提问作者Gary Gan
相关产品推荐
相关产品推荐

