Flutter在运行时抛出异常:“类型'List‘不是类型’User‘的子类型”,当用StreamProvider从Firestore中检索数据时。可以使用.cast()或List.from()对“User”中的数据强制类型安全,但这对断言没有影响。即使在'User‘中将违规列表定义为动态列表也不会改变错误。
我已经广泛地阅读了这方面的资料,比如这个Github issue、typesafe Dart和StackOverflow。这些解决方案都没有帮助,所以希望这里有人能帮助我。
最小代码样本
import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:provider/provider.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
home: StreamProvider<User>.value(
value: userData,
builder: (context, snapshot) {
return MyHomePage(title: 'Demo Error');
}
),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
final User userData = Provider.of<User>(context) ?? []; // This asserts at runtime
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'$userData.name',
),
],
),
),
);
}
}
User _getUserFromSnapshot(DocumentSnapshot snapshot){
List<String> categoriesFromDb = (snapshot.data['categories'] as List).cast<String>(); // Cast does not work
return User(uid: '8GX2aGVn0GTrwLMxSZgx6STdnnA3',
name: snapshot.data['name'],
email: snapshot.data['email'],
phone: snapshot.data['phoneNumber'],
categories: categoriesFromDb,
surname: snapshot.data['surname'],
);
}
Stream<User> get userData{
return Firestore.instance.collection('users')
.document('8GX2aGVn0GTrwLMxSZgx6STdnnA3')
.snapshots().map<User>(_getUserFromSnapshot);
}
class User {
final String uid;
final String name;
final String surname;
final String phone;
final String email;
final List<String> categories;
User({this.uid, this.name, this.surname, this.email, this.phone, this.categories})
: super();
}
重现步骤:
->使用StreamProvider从Firestore集合中检索字符串数组。
->将Firestore数据映射到自定义类型(在我的例子中是‘User’)。
-> Flutter在运行时断言。
发布于 2020-05-15 20:58:37
这是因为初始状态没有数据,所以它返回List,但您正在尝试将其分配给User类型,因为您正面临此错误。
您可以通过检查runtimeType来解决,如下所示。
final User userData = Provider.of<User>(context).runtimeType == User
? Provider.of<User>(context)
: null;
https://stackoverflow.com/questions/61818855
复制相似问题