首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Flutter & Provider,“类型'List<dynamic>‘不是类型’User‘的子类型”

Flutter & Provider,“类型'List<dynamic>‘不是类型’User‘的子类型”
EN

Stack Overflow用户
提问于 2020-05-15 20:08:20
回答 1查看 862关注 0票数 0

Flutter在运行时抛出异常:“类型'List‘不是类型’User‘的子类型”,当用StreamProvider从Firestore中检索数据时。可以使用.cast()或List.from()对“User”中的数据强制类型安全,但这对断言没有影响。即使在'User‘中将违规列表定义为动态列表也不会改变错误。

我已经广泛地阅读了这方面的资料,比如这个Github issuetypesafe DartStackOverflow。这些解决方案都没有帮助,所以希望这里有人能帮助我。

最小代码样本

代码语言:javascript
运行
复制
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在运行时断言。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-15 20:58:37

这是因为初始状态没有数据,所以它返回List,但您正在尝试将其分配给User类型,因为您正面临此错误。

您可以通过检查runtimeType来解决,如下所示。

代码语言:javascript
运行
复制
final User userData = Provider.of<User>(context).runtimeType == User
        ? Provider.of<User>(context)
        : null; 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61818855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档