我正在尝试使用动态变量访问 Dart 类中的属性。在 JavaScript 中,我可以使用括号表示法并执行以下操作:
var icons = {
mars: "male",
venus: "female"
};
getIcon = genderIcon => {
return icons[genderIcon];
};
console.log(getIcon("mars")); // Prints "male"
Run Code Online (Sandbox Code Playgroud)
我可以在 Dart 中做类似的事情吗?
我在 Dart 中尝试了两种方法,但遇到了两个我不太理解的不同错误:
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
class GenderSelection extends StatelessWidget {
final IconData genderIcon;
GenderSelection({@required this.genderIcon});
@override
Widget build(BuildContext context) {
return Container(
child: Icon(
// Using dot notation...
FontAwesomeIcons.genderIcon // error: The getter 'genderIcon' isn't defined for the class 'FontAwesomeIcons'. (undefined_getter at [bmi_calculator] lib/input_page.dart:71)
// ...or using bracket notation like JS
FontAwesomeIcons[genderIcon] // error: The operator '[]' isn't defined for the class 'Type'. (undefined_operator at [bmi_calculator] lib/input_page.dart:71)
),
);
}
}
Run Code Online (Sandbox Code Playgroud)
我添加完整的代码是为了更好地解释我想要实现的目标。此外,这是关于动态访问 Dart 中类的属性。它与图标或 FontAwesome 无关。
这是完整的代码:
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
class InputPage extends StatefulWidget {
@override
_InputPageState createState() => _InputPageState();
}
class _InputPageState extends State<InputPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
child: SafeArea(
child: Column(
children: <Widget>[
Expanded(
child: Row(
children: <Widget>[
BmiCard(
cardChild: GenderSelection(
genderIcon: 'mars', // Comment#1: This won't work.
genderLabel: 'male',
),
),
BmiCard(
cardChild: GenderSelection(
genderIcon: 'venus', // Comment#2: This won't work.
genderLabel: 'female',
),
),
],
),
),
],
),
),
),
);
}
}
class GenderSelection extends StatelessWidget {
final IconData genderIcon;
final String genderLabel;
GenderSelection({@required this.genderIcon, @required this.genderLabel});
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
children: <Widget>[
Icon(
FontAwesomeIcons().genderIcon, // Comment#3: This doesn't work.
),
Text(
genderLabel.toUpperCase(),
),
],
),
);
}
}
class BmiCard extends StatelessWidget {
final int color;
final Widget cardChild;
BmiCard({this.color = 0xFF1d1e33, this.cardChild});
@override
Widget build(BuildContext context) {
return Expanded(
child: Container(
child: cardChild,
),
);
}
}
Run Code Online (Sandbox Code Playgroud)
如果我将注释中的行更改为: - Comment#1: genderIcon: FontAwesomeIcons.mars,
- Comment#2: genderIcon: FontAwesomeIcons.venus,
- Comment#3:它将起作用genderIcon,
这里的问题是该FontAwesomeIcons库没有定义动态 getter。您无法做任何事情来让动态对象获取在您这边工作。
但是,在您的特定场景中,您可以只初始化一些变量,然后FontAwesomeIcons可以在任何您想要的地方使用它们,或者FontAwesomeIcons通过直接引用它们来使用 ' 对象(正如您在帖子末尾所指出的那样)。
还有其他方法可以实现相同的结果,例如将图标名称的映射硬编码到库中的图标对象FontAwesomeIcons。但是没有办法从类中动态获取对象,因为 getter 还没有定义。
| 归档时间: |
|
| 查看次数: |
7762 次 |
| 最近记录: |