在此代码中,我可以删除.toList()
并获得相同的输出。为什么它是可选的?
(我的理论是因为扩展运算符将输出转换为列表,所以.toList
没有做任何事情……(比如在字符串上调用.toString
)
如果我删除扩展操作符并留下.toList()
,我得到错误"type List<dynamic> is not a subtype of type Widget"
.
(这使我的理论无效,扩展操作符和。tolist具有相同的效果)
我读到前面提到的错误是由于类型推断,并看到建议将<Widget>
立即放在.map
之后,如:snapshot.data.docs.map<Widget>((e)...
,但是我得到一个类似的错误:List<Widget> is not a subtype of type Widget.
我不是要求任何人解决代码问题。只是我写代码还不到三个月……我更想找一个简单的解释,让像我这样的新手也能理解。
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:ml_app/widgets/shared/loading.dart';
class TodaysReviewScreen2 extends StatefulWidget {
@override
_TodaysReviewScreen2State createState() => _TodaysReviewScreen2State();
}
class _TodaysReviewScreen2State extends State<TodaysReviewScreen2> {
@override
Widget build(BuildContext context) {
return StreamBuilder(
stream: FirebaseFirestore.instance.collection('entries').snapshots(),
builder: (ctx, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return Loading();
}
return ListView(
padding: const EdgeInsets.all(8),
children: <Widget>[
Container(
child: Column(children:[
...snapshot.data.docs.map<Widget>((e) => Text('${e['title']}')).toList(),
]),
),
],
);
},
);
}
}
List<Widget>
不是类型Widget的子类型
我想这个日志就是你的答案。
当你使用
snapshot.data.docs.map<Widget>((e) => Text('${e['title']}'))
它将返回Iterable<Widget>
或List<Widget>
与.toList()
。
从这个:
扩展语法可用于当对象或数组中的所有元素需要包含在某种类型的列表中时。
所以简单的解释是扩展语法将把您的List<Widget>
一个接一个地传递给父列表。在这种情况下是你的Column(children:[])
。
如果您不使用扩展语法,列将看到您的List<Widget>
作为Widget
和上面的错误将出现。
map()返回Iterable,列表扩展Iterable,子列表需要一个列表