首页 > 解决方案 > 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 代码,我也会遇到同样的错误。有人可以看看并给我一些建议吗?

标签: jsonflutterlistview

解决方案


尝试在 bool 变量中初始化真值

bool _loading = true; 

_loading = true;并删除initState()


推荐阅读