Métodos de extensão do Flutter: um guia com exemplos

May 07 2023
Se você deseja criar aplicativos que funcionem em várias plataformas, o Flutter é uma ótima estrutura a ser considerada. Ele usa a linguagem de programação Dart e possui um recurso chamado “métodos de extensão” que o torna realmente flexível.

Se você deseja criar aplicativos que funcionem em várias plataformas, o Flutter é uma ótima estrutura a ser considerada. Ele usa a linguagem de programação Dart e possui um recurso chamado “métodos de extensão” que o torna realmente flexível. Com métodos de extensão, você pode adicionar novos recursos a tipos de código existentes sem precisar fazer grandes alterações. Isso economiza tempo e facilita o gerenciamento do seu código.

Nesta postagem do blog, exploraremos o que são métodos de extensão, como usá-los e alguns exemplos de como eles podem melhorar seu código Flutter.

O que são métodos de extensão?

Os métodos de extensão são uma maneira de adicionar novos métodos a tipos existentes sem alterar seu código-fonte ou criar subclasses. Eles são declarados com a palavra-chave `extensão` seguida por um nome e o tipo que eles estendem. Por exemplo, suponha que queremos adicionar um método chamado `isEven` ao tipo `int` que retorna true se o número for par e false caso contrário. Podemos escrever um método de extensão como este:

extension IntExtensions on int {
  bool get isEven => this % 2 == 0;
}

int x = 42;
print(x.isEven); // true

extension StringExtensions on String {
  String repeat(int n) {
  String result = '';
    for (int i = 0; i < n; i++) {
      result += this;
    }
    return result;
  }
}

String s = 'Hello';
print(s.repeat(3)); // HelloHelloHello

Os métodos de extensão podem ser úteis no Flutter para adicionar novas funcionalidades a widgets, modelos ou outros tipos existentes. Por exemplo, suponha que temos uma classe de modelo chamada `User` que representa um usuário em nosso aplicativo:

class User {
  final String name;
  final int age;
  final String email;
  User(this.name, this.age, this.email);
}

extension UserExtensions on User {
  Widget toCard() {
      return Card(
        child: ListTile(
        leading: Icon(Icons.person),
        title: Text(name),
        subtitle: Text('$age years old'),
        trailing: Text(email),
    ),);
  }
}

User user = User('UserName', 27, '[email protected]');
Widget card = user.toCard();

Outro exemplo de uso de métodos de extensão no Flutter é adicionar novas propriedades ou métodos a widgets existentes. Por exemplo, suponha que queremos adicionar uma propriedade chamada `borderRadius` ao widget `Container` que define o raio da borda de sua decoração. Podemos escrever um método de extensão como este:

extension ContainerExtensions on Container {
  Container get borderRadius => this.copyWith(
      decoration: BoxDecoration(
        borderRadius: BorderRadius.circular(10),
    ),
  );
}

Container container = Container(
  color: Colors.blue,
  width: 100,
  height: 100,
);
Container roundedContainer = container.borderRadius;

Confira estes exemplos úteis de extensões do Flutter para uso em produção.

Exemplo 1: Esta extensão retorna o primeiro elemento da lista ou null se a lista estiver vazia.

extension ListExtension<T> on List<T> {
  T firstOrNull() => this.isEmpty ? null : this.first;
}

extension MyStringExtensions on String {
  String capitalize() {
    return "${this[0].toUpperCase()}${this.substring(1)}";
  }
}

extension ImageExtension on Image {
  double get aspectRatio => width / height;
}

extension StringExtension on String {
  dynamic parseJson() => json.decode(this);
}

extension WidgetExtension on Widget {
  void showSnackbar(BuildContext context, String message) {
    ScaffoldMessenger.of(context).showSnackBar(SnackBar(
      content: Text(message),
    ));
  }
}

extension NavigatorExtension on BuildContext {
  void navigateTo(String routeName, {Object arguments}) {
    Navigator.pushNamed(this, routeName, arguments: arguments);
  }
}

Os métodos de extensão são um recurso poderoso do Dart que permite adicionar novas funcionalidades aos tipos existentes sem modificá-los ou criar subclasses. Eles podem ser úteis no Flutter para adicionar novas funcionalidades a widgets, modelos ou outros tipos existentes. Os métodos de extensão podem melhorar seu código Flutter, tornando-o mais expressivo, modular e reutilizável.