我正在尝试为我的用户生成一个下拉选项列表。我创建了一个自定义模型以供使用,这里是:
class UserFontModel {
String fontFamily;
FontWeight fontWeight;
UserFontModel({this.fontFamily, this.fontWeight});
}
然后我在这里创建一个实例:
List<UserFontModel> _fonts = [
UserFontModel(fontFamily: 'Bold', fontWeight: FontWeight.w700),
UserFontModel(fontFamily: 'Medium', fontWeight: FontWeight.w500),
UserFontModel(fontFamily: 'Regular', fontWeight: FontWeight.w400),
UserFontModel(fontFamily: 'Light', fontWeight: FontWeight.w300),
UserFontModel(fontFamily: 'Thin', fontWeight: FontWeight.w100),
];
然后我创建一个下拉菜单,其中包含基于上述列表的项目:
new DropdownButton<String>(
hint: Text('Style'),
items: _fonts.map((fonts) => DropdownMenuItem<String> (
child: Container(
width: MediaQuery.of(context).size.width * 0.2,
child: Text(fonts.fontFamily, style: TextStyle(fontWeight: fonts.fontWeight),),
),
)).toList(),
onChanged: (String _) {
setState(() {
print(_);
});
},
),
但是由于某种原因(可能是我所缺少的一个简单原因),我无法弄清为什么我得到了错误:
A non-null String must be provided to a Text widget.
有什么想法吗?
答案 0 :(得分:2)
好吧,我的明显想法是:发布一个带有 full 错误消息的最小可编译示例。
但是另一个可能实际上可以帮助您发现错误的想法是:不要对自己进行编程。你是人类。让机器完成艰苦的工作,这就是我们应该这样做的方式。您想确保自己的模型中永远不会出现空值吗?然后编写模型,这样,如果编译器不告诉您编译时失败的确切位置,
,就不可能有null值:class UserFontModel {
final String fontFamily;
final FontWeight fontWeight;
const UserFontModel({@required this.fontFamily, @required this.fontWeight})
: assert(fontFamily != null),
assert(fontWeight != null);
}
在没有fontFamily和fontWeight的情况下,此类并非一成不变,它会在运行时警告您,如果您提供一个且为null的 ,则可以确保在拥有这些字段后不会意外更改字段被检查是正确的。这里的重点是:这是您的编译器。机器为您完成 的工作。应该的。
这不能解决您的实际问题,但可以解决您的找不到您的实际问题。