Wenn ich bei normaler Nutzung der App auf der Root-Route (/) die Zurück-Taste drücke, wird die App geschlossen. Bisher ist dieses Verhalten in Ordnung und funktioniert wie erwartet. Wenn ich die App jedoch erneut öffne, wird nichts gerendert. Die Elemente sind zwar vorhanden (da ich durch Berühren des Bildschirms mit Schaltflächen interagieren kann), aber sie sind nicht sichtbar.
flutter doctor
Code: Select all
[√] Flutter (Channel stable, 3.19.0, on Microsoft Windows [Version 10.0.22631.4602], locale en-US)
[√] Windows Version (Installed version of Windows is version 10 or higher)
[√] Android toolchain - develop for Android devices (Android SDK version 35.0.0)
[√] Chrome - develop for the web
[√] Visual Studio - develop Windows apps (Visual Studio Community 2022 17.11.4)
[√] Android Studio (version 2024.1)
[√] VS Code (version 1.96.2)
[√] Connected device (4 available)
[√] Network resources
Code: Select all
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
import '../../pages/pages.dart';
final appRouterProvider = Provider((ref) {
return GoRouter(
initialLocation: '/',
routes: [
GoRoute(
path: '/',
builder: (context, state) => const HomePage(),
routes: [
GoRoute(
path: 'new-game',
builder: (context, state) => const NewGamePage(),
)
],
),
],
);
});
Code: Select all
import 'package:flag_game/dependecies.dart';
// import 'package:flag_game/pages/pages.dart';
import 'package:flutter/material.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'config/routes/route.dart';
Future main() async {
WidgetsFlutterBinding.ensureInitialized();
const config = String.fromEnvironment('config');
String fileName = '.env';
if (config.isNotEmpty) {
fileName = '$fileName.$config';
}
await dotenv.load(fileName: 'env/$fileName');
dependecies();
runApp(const ProviderScope(child: App()));
}
class App extends ConsumerWidget {
const App({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final appRouter = ref.watch(appRouterProvider);
return MaterialApp.router(
title: 'Flag Game',
routerConfig: appRouter,
restorationScopeId: 'app',
// builder: (context, route) => Scaffold(
// body: route,
// ),
);
}
}
Code: Select all
// import 'package:flag_game/pages/pages.dart';
import 'package:flutter/material.dart';
import 'package:flutter_animate/flutter_animate.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
import 'package:shared_preferences/shared_preferences.dart';
// import '../config/routes/route.dart';
class HomePage extends ConsumerStatefulWidget {
const HomePage({super.key});
@override
ConsumerState createState() => _HomePageState();
}
class _HomePageState extends ConsumerState {
int bestScore = 0;
@override
void initState() {
super.initState();
getBestScore();
}
Future sharedPreferences() async {
return await SharedPreferences.getInstance();
}
Future getBestScore() async {
final prefs = await sharedPreferences();
var score = prefs.getInt("bestScore") ?? 0;
setState(() {
bestScore = score;
});
}
@override
Widget build(BuildContext context) {
Widget title = Text(
'Mejor puntaje: $bestScore',
style: const TextStyle(
fontWeight: FontWeight.w900,
fontSize: 40,
color: Color(0xFF666870),
height: 0.9,
letterSpacing: -2,
),
);
title = title
.animate(onPlay: (controller) => controller.repeat(reverse: true))
.saturate(delay: 500.milliseconds, duration: 500.milliseconds)
.then() // set baseline time to previous effect's end time
// .tint(color: const Color(0xFF80DDFF))
.then()
.blurXY(end: 1)
.fadeOut();
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
title,
Padding(
padding: const EdgeInsets.only(top: 20),
child: ElevatedButton(
style: ButtonStyle(
backgroundColor:
MaterialStatePropertyAll(Colors.grey[300])),
onPressed: () {
context.push('/new-game');
},
child: const Text(
"Juego Nuevo",
style: TextStyle(color: Colors.black),
)),
),
],
)),
);
}
}
Code: Select all
import 'package:data/data.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:go_router/go_router.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../../services/services.dart';
class NewGamePage extends ConsumerStatefulWidget {
const NewGamePage({super.key});
@override
ConsumerState createState() => _NewGamePageState();
}
class _NewGamePageState extends ConsumerState {
GameService gameService = GameService();
bool disableButtons = false;
bool loadingImg = false;
int bestScoreLocal = 0;
int bestScoreGlobal = 0;
int lives = 0;
QuestionResponseModel questionResponse = QuestionResponseModel();
@override
void initState() {
super.initState();
newGame();
}
Future sharedPreferences() async {
return await SharedPreferences.getInstance();
}
void newGame() {
setupGame();
newQuestion();
getBestScore();
}
void setupGame() {
setState(() {
lives = 5;
});
}
void gameOver() {
context.pop();
}
void newQuestion() async {
final r = await gameService.newQuestion(QuestionParamsModel());
setState(() {
questionResponse = r;
disableButtons = false;
});
}
void validateAnswer(CountryItemModel el) {
loadingImg = true;
bool isGameOver = false;
setState(() {
disableButtons = true;
});
String msg = "Correcto";
String gameOverText = "Juego Terminado";
String correctAnsw = '';
bool isCorrect = el.id == questionResponse.correctAnswer?.id;
if (!isCorrect) {
msg = "Incorrecto";
correctAnsw = questionResponse.correctAnswer!.countryName;
lives -= 1;
} else {
setState(() {
bestScoreLocal += 1;
});
}
isGameOver = lives == 0;
if (isGameOver) {
setBestScore();
}
showModalBottomSheet(
useSafeArea: true,
isDismissible: false,
barrierColor: Colors.transparent,
context: context,
builder: (BuildContext context) {
return Container(
padding: const EdgeInsets.all(10),
height: 230,
child:Placeholder(),
);
},
);
}
Future setBestScore() async {
final prefs = await sharedPreferences();
var score = prefs.getInt('bestScore') ?? 0;
if (bestScoreLocal > score) {
prefs.setInt('bestScore', bestScoreLocal);
}
}
Future getBestScore() async {
final prefs = await sharedPreferences();
var score = prefs.getInt('bestScore') ?? 0;
setState(() {
bestScoreGlobal = score;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Colors.greenAccent,
title: const Center(child: Text("Adivina la Bandera")),
),
body: Container(
padding: const EdgeInsets.all(10),
child: Placeholder(),
));
}
}
Hat jemand eine Idee, was das sein könnte? Geht etwas schief?
Ich habe versucht, restaurierungScopeId: 'app' hinzuzufügen, aber es war vergebens. Ich habe die Konfiguration in der Hauptdatei geändert, indem ich den Builder-Abschnitt auskommentiert habe, aber es funktioniert nicht.