动态访问Dart/Flutter中类的属性

And*_*ira 7 dart flutter

我正在尝试使用动态变量访问 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,

Ble*_*man 3

这里的问题是该FontAwesomeIcons库没有定义动态 getter。您无法做任何事情来让动态对象获取在您这边工作。

但是,在您的特定场景中,您可以只初始化一些变量,然后FontAwesomeIcons可以在任何您想要的地方使用它们,或者FontAwesomeIcons通过直接引用它们来使用 ' 对象(正如您在帖子末尾所指出的那样)。

还有其他方法可以实现相同的结果,例如将图标名称的映射硬编码到库中的图标对象FontAwesomeIcons。但是没有办法从类中动态获取对象,因为 getter 还没有定义。