【发布时间】:2021-06-06 06:29:42
【问题描述】:
我在 Vipin Vijayan 的 tutorial on parsing JSON in ListView 上关注 Flutter 的 fetch data from the internet cookbook 并收到以下错误:
═══════════════════════════════════小部件库捕获的异常 ═══════════════════════════════════抛出以下断言 构建 MyApp(脏,状态:_MyAppState#a2d98):断言失败: 布尔表达式不能为空
相关的导致错误的小部件是 MyApp package:le_moineau/main.dart:35 抛出异常时,这个 是堆栈 #0 _MyAppState.build 包:le_moineau/main.dart:70 #1 StatefulElement.build 包:flutter/…/widgets/framework.dart:4802 #2 ComponentElement.performRebuild package:flutter/…/widgets/framework.dart:4685 #3 StatefulElement.performRebuild 包:flutter/…/widgets/framework.dart:4857 #4 Element.rebuild package:flutter/.../widgets/framework.dart:4379 ...
这是我的 Users.dart 使用 https://app.quicktype.io/ 解析的代码
// To parse this JSON data, do
//
// final users = usersFromJson(jsonString);
import 'dart:convert';
List<User> usersFromJson(String str) =>
List<User>.from(json.decode(str).map((x) => User.fromJson(x)));
String usersToJson(List<User> data) =>
json.encode(List<dynamic>.from(data.map((x) => x.toJson())));
class User {
User({
this.userId,
this.id,
this.title,
this.completed,
});
int userId;
int id;
String title;
bool completed;
factory User.fromJson(Map<String, dynamic> json) => User(
userId: json["userId"],
id: json["id"],
title: json["title"],
completed: json["completed"],
);
Map<String, dynamic> toJson() => {
"userId": userId,
"id": id,
"title": title,
"completed": completed,
};
}
这是我的 main.dart 代码:
import 'dart:async';
//import 'dart:convert';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'others/Users.dart';
class MyHttpOverrides extends HttpOverrides {
@override
HttpClient createHttpClient(SecurityContext context) {
return super.createHttpClient(context)
..badCertificateCallback =
(X509Certificate cert, String host, int port) => true;
}
}
Future<List<User>> getUsers() async {
final response =
await http.get(Uri.https('jsonplaceholder.typicode.com', 'todos'));
//await http.get("https://192.168.1.4:8081/json/todos.json");
if (response.statusCode == 200) {
// If the server did return a 200 OK response,
// then parse the JSON.
final List<User> users = usersFromJson(response.body);
return users;
} else {
// If the server did not return a 200 OK response,
// then throw an exception.
throw Exception('Failed to load users');
}
}
void main() => runApp(MyApp());
class MyApp extends StatefulWidget {
MyApp({Key key}) : super(key: key);
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
List<User> _users;
bool _loading;
@override
void initState() {
HttpOverrides.global = new MyHttpOverrides();
super.initState();
_loading = true;
getUsers().then((users) {
setState(() {
_users = users;
_loading = false;
});
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Fetch Data Example',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Scaffold(
appBar: AppBar(
title: Text(_loading ? 'Loading...' : 'Users'),
),
body: Container(
color: Colors.white,
child: ListView.builder(
itemCount: null == _users ? 0 : _users.length,
itemBuilder: (context, index) {
User user = _users[index];
return ListTile(
title: Text('This is a test'),
subtitle: Text(user.title),
);
}),
),
),
);
}
}
即使我使用 Vipin 的股票 Widget Build 代码,我也会遇到同样的错误。有人可以看看并给我一些建议吗?
【问题讨论】: