Dart: оператор распространения для конструктора - PullRequest
1 голос
/ 07 марта 2019

В моем приложении флаттер у меня есть виджеты, как показано ниже:

Container(
  decoration: BoxDecoration(
    border: Border.all(
      color: Colors.red,
      width: 2,
      style: BorderStyle.solid,
    ),
  ),
  child: Text('Container 1'),
)
Container(
  decoration: BoxDecoration(
    border: Border(
      top: BorderSide(
        color: Colors.red,
        width: 2,
        style: BorderStyle.solid,
      ),
    ),
  ),
  child: Text('Container 2'),
)

Оба используют одинаковые свойства для своих границ . Поэтому мне было интересно, есть ли оператор распространения -подобный способ вставки одинаковых свойств для обоих виджетов? Может быть, как:

const borderBase = (
  color: Colors.red,
  width: 2,
  style: BorderStyle.solid,
)

Container(
  decoration: BoxDecoration(
    border: Border.all(
      ...borderBase,
    ),
  ),
  child: Text('Container 1'),
)

Container(
  decoration: BoxDecoration(
    border: Border(
      top: BorderSide(
        ...borderBase,
      ),
    ),
  ),
  child: Text('Container 2'),
)

Ответы [ 3 ]

2 голосов
/ 07 марта 2019

Вы можете сделать что-то вроде этого:

const BorderSide borderBase = BorderSide(
  color: Colors.red,
  width: 2,
  style: BorderStyle.solid,
);

Container(
  decoration: BoxDecoration(
    border: Border.all(
      color: borderBase.color,
      width: borderBase.width,
      style: borderBase.style,
    ),
  ),
  child: Text('Container 1'),
)

Container(
  decoration: BoxDecoration(
    border: Border(
      top: borderBase,
    ),
  ),
  child: Text('Container 2'),
)

Не самый лучший, но все же повторное использование.

2 голосов
/ 07 марта 2019

Нет такой вещи.

Оператор распространения находится в разработке, но он предназначен только для списков, а не для классов (https://github.com/dart-lang/language/issues/47)

1 голос
/ 14 марта 2019

Вот фиктивный пример шаблона оператора распространения моего бедняка:

Я создаю конструктор копирования для классов, часто воссоздаемых с небольшими изменениями.Это дополнительная работа во время определения, но она окупается во многих местах при использовании этих классов.Тот же самый шаблон может использоваться в стандартных классах путем создания подклассов - просто для подключения к конкретному вопросу.

class Address {
    final String street;
    final String city;
    final String state;

    Address({this.street, this.city, this.state});

    Address.copy(Address copy, {
        String street,
        String city,
        String state,
    }) : this (
        street: street ?? copy.street,
        city: city ?? copy.city,
        state: state ?? copy.state,
    );
}

class User {
    final String firstName;
    final String lastName;
    final Address address;
    final String email;

    User({this.firstName, this.lastName, this.address, this.email});

    User.copy(User copy, {
        String firstName,
        String lastName,
        Address address,
        String email,
    }) : this (
        firstName: firstName ?? copy.firstName,
        lastName: lastName ?? copy.lastName,
        address: address ?? copy.address,
        email: email ?? copy.email,
    );
}

void workWithUsers(User user) {
    final userChangedEmail = User.copy(user, email: 'new@email.com');
    final userMovedToAnotherStreet = User.copy(user, address: Address.copy(user.address, street: 'Newstreet'));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...