Provider: Observar ou ler
Parte da seção Gerenciamento de estado do Journey de Flutter da Coddy. Lição 11 de 27.
Há duas maneiras de obter um modelo do Provider, e elas têm funções diferentes.
context.watch<StepCounter>() obtém o modelo e se inscreve nele: quando o modelo chama notifyListeners(), este widget é reconstruído. Use-o em build, para tudo o que a tela exibe.
context.read<StepCounter>() obtém o modelo uma única vez, sem se inscrever. Use-o em callbacks como onPressed, quando quiser chamar um método sem exibir nada:
Widget build(BuildContext context) {
final steps = context.watch<StepCounter>().steps; // exibe
return ElevatedButton(
onPressed: () => context.read<StepCounter>().walk(), // age
child: Text('$steps steps'),
);
}Se você confundir os dois, vai perceber. read em build exibe o primeiro valor para sempre. watch dentro de onPressed é um erro, porque um toque não é uma construção e não há nada em que se inscrever.
Desafio
FácilWalk adiciona 1000 passos ao modelo, mas a tela continua mostrando 0 steps.
- Faça a linha dos passos acompanhar o modelo, para que cada toque mostre o novo número.
- Mantenha a chamada do botão como está.
Experimente você mesmo
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class StepCounter extends ChangeNotifier {
int _steps = 0;
int get steps => _steps;
void walk() {
_steps += 1000;
notifyListeners();
}
}
void main() {
runApp(
ChangeNotifierProvider(
create: (context) => StepCounter(),
child: const MyApp(),
),
);
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp(
debugShowCheckedModeBanner: false,
home: HomePage(),
);
}
}
class HomePage extends StatelessWidget {
const HomePage({super.key});
@override
Widget build(BuildContext context) {
final steps = context.read<StepCounter>().steps;
return Scaffold(
appBar: AppBar(title: const Text('Steps')),
body: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Text('$steps steps', style: const TextStyle(fontSize: 40)),
const SizedBox(height: 16),
ElevatedButton(
onPressed: () {
context.read<StepCounter>().walk();
},
child: const Text('Walk'),
),
],
),
),
);
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Gerenciamento de estado
Pratique por conta própria: Compilador de Flutter online