flutter - Flutter 通过传递任何结构化数据制作 DropDown 小部件
问题描述
在这个新的中widget
,我想DropDown
通过传递任何结构化数据来创造新的东西,例如,这extendedClass
是一个pairValue
我想在这里传递的类。
这段代码不正确,我无法在那里正确传递
class CDropDown extends StatelessWidget {
final List<T> dataClass;
final T className;
CDropDown({@required this.className, @required this.dataClass});
@override
Widget build(BuildContext context) {
return DropdownButton<className>(
value: dataClass[0],
underline: Container(),
isExpanded: true,
icon: Icon(Icons.keyboard_arrow_down),
items: dataClass.map((className user) {
return DropdownMenuItem<className>(
value: user,
child: Text(
user.name),
);
}).toList(),
onChanged: null,
);
}
}
例如:
class User {
const User(this.id,this.name);
final String name;
final int id;
}
List<User> users = <User>[const User(1,'Foo'), const User(2,'Bar')];
CDropDown(className:User, dataClass :users );
解决方案
这是一个建议
class CDropDown<T> extends StatelessWidget {
final List<T> dataClass;
final Widget Function(T) itemBuilder;
CDropDown({@required this.dataClass, @required this.itemBuilder});
@override
Widget build(BuildContext context) {
return DropdownButton<T>(
value: dataClass[0],
underline: Container(),
isExpanded: true,
icon: Icon(Icons.keyboard_arrow_down),
items: dataClass.map((T user) {
return DropdownMenuItem<T>(
value: user,
child: itemBuilder(user),
);
}).toList(),
onChanged: null,
);
}
}
我补充一下itemBuilder
,原因是当我打电话user.name
时CDropDown
,它会显示The getter 'name' isn't defined for the type 'T'.
。它应该像这样使用
class User {
const User(this.id,this.name);
final String name;
final int id;
}
List<User> users = <User>[const User(1,'Foo'), const User(2,'Bar')];
CDropDown<User>(dataClass :users, itemBuilder:(user){return Text(user.name);} );
推荐阅读
- c# - 如何将 MenuItem 资源添加到现有的 MenuItem 控件模板?
- php - While循环在显示之前不等待
- asp.net-core - 是否可以从浏览器调用 blazor-server 函数
- c# - 具有自关闭/关闭标签能力的扩展 Html Link 类
- flutter - 颤振注射模拟
- amazon-cloudwatch - 如何摆脱“collect_GenericJMX_value”作为收集的自定义指标的 CW 指标名称?
- python - python列表中的字符串是用花括号写的
- firebase - 用于一对一消息传递的 Firebase 数据库结构?
- azure-active-directory - Azure AD:通过 AAD 在 jwt 令牌中缺少角色声明
- bash - 终端无法理解 Bash 脚本;权限被拒绝错误?