Skip to content

Instantly share code, notes, and snippets.

@gildaswise
Last active September 11, 2025 14:45
Show Gist options
  • Select an option

  • Save gildaswise/7aa8127ec348126dd30a6ee792f5faea to your computer and use it in GitHub Desktop.

Select an option

Save gildaswise/7aa8127ec348126dd30a6ee792f5faea to your computer and use it in GitHub Desktop.
Explicação sobre funções que retornam Widget
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