Skip to content

Instantly share code, notes, and snippets.

@ulisseshen
Last active February 28, 2025 21:35
Show Gist options
  • Save ulisseshen/96265b16c67a5350e5eb979759d1ff8f to your computer and use it in GitHub Desktop.
Save ulisseshen/96265b16c67a5350e5eb979759d1ff8f to your computer and use it in GitHub Desktop.
import 'package:flutter/material.dart';
import 'dart:async';
void main() {
runApp(MyApp());
}
class CallbackManager {
CallbackManager._();
static final CallbackManager instance = CallbackManager._();
/// Callback registrado que pode ser acionado externamente.
VoidCallback? onCallback;
/// Método para acionar o callback, se estiver registrado.
void triggerCallback() {
if (onCallback != null) {
onCallback!();
}
}
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Teste Callback com Navegação',
initialRoute: '/',
routes: {
'/': (context) => const HomeScreen(),
'/dummy': (context) => const DummyScreen(),
},
);
}
}
class HomeScreen extends StatelessWidget {
const HomeScreen({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Home - CallbackWidget'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: [
const SizedBox(height: 20),
// Botão para disparar o callback enquanto o widget está visível
ElevatedButton(
onPressed: () {
CallbackManager.instance.triggerCallback();
},
child: const Text('Disparar Callback'),
),
const SizedBox(height: 20),
// Botão para navegar para outra tela, descartando o CallbackWidget
ElevatedButton(
onPressed: () {
Navigator.pushNamed(context, '/dummy');
},
child: const Text('Navegar para outra tela'),
),
],
),
),
);
}
}
class DummyScreen extends StatefulWidget {
const DummyScreen({super.key});
@override
State<DummyScreen> createState() => _DummyScreenState();
}
class _DummyScreenState extends State<DummyScreen> {
bool _callbackFired = false;
@override
Widget build(BuildContext context) {
CallbackManager.instance.onCallback = () {
Timer(const Duration(seconds: 1), () {
// Aqui não há verificação de mounted, o que forçará o erro
setState(() {
_callbackFired = true;
});
});
};
return Scaffold(
appBar: AppBar(
title: const Text('Dummy Screen'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: [
const Text(
'Esta é uma tela dummy.\nO CallbackWidget foi descartado.',
style: TextStyle(fontSize: 20),
textAlign: TextAlign.center,
),
const SizedBox(height: 20),
// Botão para voltar à HomeScreen
ElevatedButton(
onPressed: () {
Navigator.pop(context);
},
child: const Text('Voltar'),
),
],
),
),
);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment