json - Flutter 断言失败:布尔表达式不能为空
问题描述
我在 Vipin Vijayan 的教程上解析 ListView 中的 JSON,遵循 Flutter从互联网食谱中获取数据并收到以下错误:
═══════════════════════════════════小部件库捕获的异常══␕═══ ═════════════════════════ 在构建 MyApp(dirty, state: _MyAppState#a2d98) 时抛出了以下断言:断言失败:布尔表达式不能是无效的
相关的导致错误的小部件是 MyApp package:le_moineau/main.dart:35 当抛出异常时,这是堆栈 #0 _MyAppState.build package:le_moineau/main.dart:70 #1 StatefulElement.build package:flutter/ …/widgets/framework.dart:4802 #2 ComponentElement.performRebuild package:flutter/…/widgets/framework.dart:4685 #3 StatefulElement.performRebuild package:flutter/…/widgets/framework.dart:4857 #4 Element.rebuild包:flutter/.../widgets/framework.dart:4379 ...
这是使用https://app.quicktype.io/解析的我的 Users.dart 的代码
// 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 代码,我也会遇到同样的错误。有人可以看看并给我一些建议吗?
解决方案
尝试在 bool 变量中初始化真值
bool _loading = true;
_loading = true;
并删除initState()
推荐阅读
- c - “%1$d”输出是什么意思?
- azure - 使用 powershell 配置 NSG 规则 - 导入 ASG 时遇到问题
- c# - 给定对结构的托管引用,如何在偏移量处获取对字段的托管引用?
- wordpress - 有没有办法在 WordPress 中为每个客户端创建自定义 URL
- c# - LINQ:比较两个数据表中的特定值
- php - Laravel/Mysql - 处理大数据
- typescript - Firebase Functions.EventContext 在更新后变得未定义
- extjs - 如何在 Sencha Ext.js 通用应用程序中查看现代视图
- java - 无法在 javafx 中链接 fxml 和控制器文件变量
- c# - 如果另一个项目空了,则显示 1 个项目(角度 6 材料)