即使我将变量强制转换为完全相同的类,变量的类型也会返回false

时间:2019-01-21 22:05:37

标签: types casting flutter

我不明白为什么构建函数中的print(item is MyClass);行对于所有项目都返回false。

如您所见,列表是MyClass项,当我获得索引项时,将其强制转换为MyClass。打印行代码仍然返回false。

这是小部件的代码:

import ...;

class _ListTheatreState extends State<ListTheatre> {
  List<MyClass> items = [];

  @override
  void initState() {
    super.initState();
    _getEvents();
  }

  _getEvents() async {
    final url = '...';
    try {
      http.Response res = await http.get(url);
      final data = json.decode(res.body);
      this.items = data["data"];
    } catch(e) {
      print(e);
    }
  }

  @override
  Widget build(BuildContext context) {
    return ListView.builder(
      itemCount: items.length,
      itemBuilder: (context, index) {
        final MyClass item = items[index];
        print(item is MyClass); // **<-- RETURNS FALSE**
        ...
      },
    );
  }
}

class ListTheatre extends StatefulWidget {
  ListTheatre({Key key}) : super(key: key);

  @override
  _ListTheatreState createState() => _ListTheatreState();
}

1 个答案:

答案 0 :(得分:1)

Json.decode不知道如何神奇地创建对象类型。没有json,就无法确定确切返回了什么,但是我假设是一个json对象,在dart中,它将是Map<dynamic, dynamic>。您将其强制转换为MyClass,这不会失败,因为dart假定如果您正在强制转换某些内容,则需要事先检查类型。如果随后要使用item对象,则可以肯定它会引发某种异常。由于对象是Map类型而不是MyClass类型,因此返回false。尝试打印item.runtimeType-应该会给您一个更好的主意。

您需要做的是解析json并使用它创建MyClass实例。您可以手动执行此操作,也可以使用代码生成。参见flutter的json docs