Можно ли добавить json в свойствах элемента? - PullRequest
2 голосов
/ 28 мая 2020

У меня есть json вот так:

    Map<String, dynamic> optionsContainer() {
      return {
        "color": Colors.red,
        "height": MediaQuery.of(context).size.height * 0.40,
        "margin": EdgeInsets.all(10)
      };
    }
.
.
.
 Container(
  child:Text("mytext"),
  optionsContainer(),
 )

Я получаю сообщение об ошибке, когда пытаюсь назначить его свойствам элемента, в данном случае container

Есть ли способ сделать это?

Я получаю эту ошибку:

«Слишком много позиционных аргументов: ожидается 0, но найден 1. Попробуйте удалить лишние позиционные аргументы или указать имя для именованных аргументов. "

моя идея состоит в том, чтобы переработать код и определить эти свойства в классе, чтобы не повторять их снова.

ПРИМЕЧАНИЕ. Я не делаю этого с theme, поскольку это только для одного класса в моем приложении, я не хочу, чтобы он перезаписывал другие стили.

1 Ответ

2 голосов
/ 28 мая 2020

Если вы знаете все возможные ключи на карте, вы можете извлекать значения и передавать их как обычные именованные параметры:

final options = optionsContainer();
Container(
  color: options["color"],
  height: options["height"],
  margin: options["margin"],
)

В качестве альтернативы вы можете создать класс для данных контейнера и использовать это вместо карты, которая дает проверку типов во время компиляции:

class ContainerData {
  final Color color;
  final double height;
  final EdgeInsets margin;

  ContainerData({
    @required this.color,
    @required this.height,
    @required this.margin,
  });
}
ContainerData getOptions() {
  return ContainerData(
    color: Colors.red,
    height: MediaQuery.of(context).size.height * 0.40,
    margin: EdgeInsets.all(10),
  );
}
final options = getOptions();
Container(
  color: options.color,
  height: options.height,
  margin: options.margin,
)
...