mirror of
https://github.com/flutter/samples.git
synced 2025-11-11 07:18:15 +00:00
Add game_template (#1180)
Adds a template / sample for games built in Flutter, with all the bells and whistles, like ads, in-app purchases, audio, main menu, settings, and so on. Co-authored-by: Parker Lougheed Co-authored-by: Shams Zakhour
This commit is contained in:
63
game_template/lib/src/app_lifecycle/app_lifecycle.dart
Normal file
63
game_template/lib/src/app_lifecycle/app_lifecycle.dart
Normal file
@@ -0,0 +1,63 @@
|
||||
// Copyright 2022, the Flutter project authors. Please see the AUTHORS file
|
||||
// for details. All rights reserved. Use of this source code is governed by a
|
||||
// BSD-style license that can be found in the LICENSE file.
|
||||
|
||||
import 'package:flutter/widgets.dart';
|
||||
import 'package:logging/logging.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
class AppLifecycleObserver extends StatefulWidget {
|
||||
final Widget child;
|
||||
|
||||
const AppLifecycleObserver({required this.child, Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
_AppLifecycleObserverState createState() => _AppLifecycleObserverState();
|
||||
}
|
||||
|
||||
class _AppLifecycleObserverState extends State<AppLifecycleObserver>
|
||||
with WidgetsBindingObserver {
|
||||
static final _log = Logger('AppLifecycleObserver');
|
||||
|
||||
final ValueNotifier<AppLifecycleState> lifecycleListenable =
|
||||
ValueNotifier(AppLifecycleState.inactive);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
// Using InheritedProvider because we don't want to use Consumer
|
||||
// or context.watch or anything like that to listen to this. We want
|
||||
// to manually add listeners. We're interested in the _events_ of lifecycle
|
||||
// state changes, and not so much in the state itself. (For example,
|
||||
// we want to stop sound when the app goes into the background, and
|
||||
// restart sound again when the app goes back into focus. We're not
|
||||
// rebuilding any widgets.)
|
||||
//
|
||||
// Provider, by default, throws when one
|
||||
// is trying to provide a Listenable (such as ValueNotifier) without using
|
||||
// something like ValueListenableProvider. InheritedProvider is more
|
||||
// low-level and doesn't have this problem.
|
||||
return InheritedProvider<ValueNotifier<AppLifecycleState>>.value(
|
||||
value: lifecycleListenable,
|
||||
child: widget.child,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
void didChangeAppLifecycleState(AppLifecycleState state) {
|
||||
_log.info(() => 'didChangeAppLifecycleState: $state');
|
||||
lifecycleListenable.value = state;
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
WidgetsBinding.instance!.removeObserver(this);
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
WidgetsBinding.instance!.addObserver(this);
|
||||
_log.info('Subscribed to app lifecycle updates');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user