flutter - 将类中成员的名称作为参数传递给函数
问题描述
我想做一个非常通用的小部件,我可以给它我想要的任何对象。在这个小部件中,根据我给它的对象,我需要用一个文本小部件来表示对象。我的问题是我要使用的对象没有所有相同的成员名称。假设在一种情况下,我要给对象 Carrot,在这种情况下,我想在文本小部件中显示名为“name”的成员,但在另一种情况下,我可以给它对象模板,在这种情况下,我想显示会员“代码”。它们总是字符串类型。因此,在小部件中,“标题”部分将替换为我想要显示的内容。
class DialogDropdown extends StatelessWidget with TextStylesHelper{
final SizingInformation _sizeInfo;
final Function _onChanged;
final List _objectList;
DialogDropdown(
this._sizeInfo,
this._onChanged,
this._objectList,
);
@override
Widget build(BuildContext context) {
return Dialog(
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10.0)),
child: ListView.separated(
itemBuilder: (context, index) {
var item = _objectList[index];
return ListTile(
title: Text('titre', style: labelTextStyle(_sizeInfo.scaleFactor),),
onTap: (){
Navigator.pop(context, item);
},
);
},
separatorBuilder: (context, index) => Divider(
thickness: 1.5,
height: _sizeInfo.screenSize.height / 40,
),
itemCount: _objectList.length,
),
);
}
}
希望您能够帮助我。
解决方案
所有对象都应该实现 toString() 覆盖并显示一些有意义的东西。您还可以实现一个抽象基类并强制所有派生类实现例如名称属性。您的小部件应更改为模板class WhatEver<T extends NameProvider> extends StatelessWidget with TextStylesHelper{ {
回调onChange
也必须模板化
typedef void OnChange<T extends NameProvider>(T newValue);
。对于List<T extends NameProvider>
推荐阅读
- python - 根据值的数量连接嵌套的字典键
- kubernetes - 为什么 NodePort 服务类型必须使用基于 ClusterIP 的负载均衡?
- python - 仅在程序开始时难以覆盖日志文件
- visual-studio-code - Visual Studio Code 任务正在将工作目录添加到命令中
- angular - 从角度 6 中的命名空间导出的枚举导致运行时错误
- unity3d - 如何获取 Unity 内置资源的路径和文件大小?
- html - 增加按钮填充时如何防止 div 大小发生变化?
- python - 圣杯框架:请求未指定带有图像/jpeg 的 Accept 标头
- android - 可能的动态 SSL 证书固定?
- javascript - 我播放的音频文件越多,AudioContext 就会影响应用程序性能