Last active
September 11, 2025 14:45
-
-
Save gildaswise/7aa8127ec348126dd30a6ee792f5faea to your computer and use it in GitHub Desktop.
Explicação sobre funções que retornam Widget
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import 'package:flutter/material.dart'; | |
| // Esse exemplo visa mostrar o que acontece ao utilizar | |
| // funções que retornam Widget ao invés de classes | |
| void main() => runApp(MyApp()); | |
| class MyApp extends StatelessWidget { | |
| @override | |
| Widget build(context) { | |
| return Counter( | |
| count: Count(), | |
| child: MaterialApp(home: Home()), | |
| ); | |
| } | |
| } | |
| class Count extends ValueNotifier<int> { | |
| Count() : super(0); | |
| } | |
| class Counter extends InheritedNotifier { | |
| const Counter({Key? key, required this.count, required Widget child}) | |
| : super(key: key, child: child, notifier: count); | |
| final Count count; | |
| static Count of(BuildContext context, {bool listen = true}) { | |
| if (listen) { | |
| return context.dependOnInheritedWidgetOfExactType<Counter>()!.count; | |
| } else { | |
| final Counter counter = | |
| context.getElementForInheritedWidgetOfExactType<Counter>()!.widget | |
| as Counter; | |
| return counter.count; | |
| } | |
| } | |
| } | |
| // Aqui temos um Widget que lê o valor do contador via context | |
| class Title extends StatelessWidget { | |
| @override | |
| Widget build(context) { | |
| print('build Title - Stateless'); | |
| return Text('Count ${Counter.of(context).value}'); | |
| } | |
| } | |
| enum TipoDoExemplo { classe, classeBuild, classeVariavel, funcao, funcaoBuild } | |
| /// Ao trocar o tipo do exemplo utilizando a variável abaixo você verá os resultados no terminal | |
| /// do canto inferior direito. | |
| var _tipoDoExemplo = TipoDoExemplo.funcao; | |
| /// 1. Utilizando uma classe, a árvore de renderização é capaz de separar o que exatamente | |
| /// precisa ser renderizado em uma mudança de estado. | |
| /// 2. Ao utilizar uma função, esse elo não é feito e a árvore precisa executar a função para qualquer alteração de estado | |
| /// 3. Mesmo colocando a função dentro do build, o mesmo acontece porque não há elo criado entre os widgets | |
| // criados | |
| /// 4. Dito isso, dá pra utilizar funções dentro do build desde que elas retornem widgets que foram | |
| /// separados em classe | |
| /// 5. E também dá pra salvar os widgets classe em variáveis e utilizá-los na árvore normalmente | |
| class Home extends StatelessWidget { | |
| Widget title(BuildContext context) { | |
| print('build Title - função fora do build'); | |
| return Text('Count ${Counter.of(context).value}'); | |
| } | |
| @override | |
| Widget build(BuildContext context) { | |
| print('build Home'); | |
| Widget title2(BuildContext context) { | |
| print('build Title - função no build'); | |
| return Text('Count ${Counter.of(context).value}'); | |
| } | |
| Widget title3(BuildContext context) { | |
| print('build Title - função no build retornando classe'); | |
| return Title(); | |
| } | |
| Widget title4 = Title(); | |
| return Scaffold( | |
| body: Center( | |
| child: switch (_tipoDoExemplo) { | |
| TipoDoExemplo.classe => Title(), | |
| TipoDoExemplo.funcao => title(context), | |
| TipoDoExemplo.funcaoBuild => title2(context), | |
| TipoDoExemplo.classeBuild => title3(context), | |
| TipoDoExemplo.classeVariavel => title4, | |
| }, | |
| ), | |
| floatingActionButton: FloatingActionButton( | |
| onPressed: () => Counter.of(context, listen: false).value++, | |
| child: const Icon(Icons.add), | |
| ), | |
| ); | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment