Introdução

Fala galera! Hoje vou falar um pouco sobre uma atualização mais recente que chegou no Flutter e acabou mudando algumas coisas lá da base do projeto. A alteração acontece lá no arquivo Main do projeto e tem impacto dentro de todo o projeto na hora de alterar o esquema de cores da sua aplicação.

Criação do Projeto

Vamos criar um projeto básico mesmo e focarmos em alterar as cores dentro do Contador básico criado por padrão com o Flutter. Estarei utilizando a versão 2.5.0 do Flutter e criarei um projeto chamado “temas”.

Criando projeto Flutter

Vou utilizar o código inicial padrão e irei apenas deletar os comentários do código.

Código inicial Flutter

Aqui está o código inicial:

import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}

O resultado, como por padrão, será esse:

Aplicação inicial

A partir daqui vamos criar novos temas e modificar as cores desse projeto.

Nova forma de criar temas

A forma como se era trabalhada essa questão das cores antes funcionava com o atributo “primarySwatch” para a cor principal e o atributo “accentColor” como uma cor secundária dentro do projeto diretamente no “theme” do “MaterialApp”.

Agora, essa questão do “accentColor” não funciona mais, está deprecated. No site oficial da documentação do Flutter temos as instruções de migração para a nova forma → https://flutter.dev/docs/release/breaking-changes/theme-data-accent-properties

A primeira coisa a fazer é criar uma variável que irá armazenar o nosso tema. Dessa forma:

Criando variável tema

A partir disso iremos referenciar esse tema lá no “theme” do “MaterialApp”, dessa forma:

Criando tema 2

Agora, irei criar as cores primária e secundária dentro dessa nova forma.

Adicionando cores

E o resultado será esse:

Resultado

Para variar entre os temas entre o Light e o Dark basta mudar a propriedade “brightness” dentro da variável “tema” que a gente criou. É possível utilizar o “Brightness.light” para o tema claro, que é o padrão. Nesse caso, o resultado não irá ser alterado, afinal, o tema claro já é o padrão utilizado pelo Flutter.

Tema claro

E também podemos utilizar o “Brightness.dark” para o tema escuro.

Tema escuro

O resultado será o seguinte:

Resultado do tema escuro

Alterando as cores dos widgets

Para alterar as cores dentro do projeto a sintaxe mudou um pouco também. Agora é necessário apontar para o “primary” e “secondary” dentro do “colorScheme”.

Vou continuar utilizando o Tema Escuro para demonstrar como trocar a cor da “AppBar” para a cor secundária que definimos e a cor da botão inferior para a cor primária que definimos.

No código será necessário fazer desse jeito:

Alterando cor de widget 01

Alterando cor de widget 02

O resultado será o seguinte:

Resultado da coloração de widgets

O código final ficará assim:

import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    final ThemeData tema = ThemeData(
      brightness: Brightness.dark,
    );

    return MaterialApp(
      title: 'Flutter Demo',
      theme: tema.copyWith(
        colorScheme: tema.colorScheme.copyWith(
          primary: Colors.deepPurple,
          secondary: Colors.red,
        ),
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.secondary,
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        backgroundColor: Theme.of(context).colorScheme.primary,
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}

O que existe dentro do colorScheme

No construtor do “colorScheme” temos as seguintes propriedades:

Propriedades do colorScheme

Como podem ver todas estão marcadas como “required” porém só utilizamos algumas. Isso acontece por conta do “copyWith” que faz com que todas as propriedades não utilizadas recebam seu valor padrão. De toda forma, podemos utilizar quaisquer desses valores com quaisquer cores para personalizamos os temas da nossa aplicação.

Conclusão

Então é isso pessoal! Dessa forma podemos corrigir as mensagens “deprecated” dentro dos nossos projetos que utilizavam o “accentColor” como meio de cor secundária. Obrigado pela atenção e até a próxima!