blob: 09ad44d79f117d91919e33b4e42e82e5b2421ca9 [file] [log] [blame]
// Copyright 2014 The Flutter Authors. 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/material.dart';
import 'package:flutter/scheduler.dart';
/// Flutter code sample for [AppLifecycleListener].
void main() {
runApp(const AppLifecycleListenerExample());
}
class AppLifecycleListenerExample extends StatelessWidget {
const AppLifecycleListenerExample({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp(
home: Scaffold(body: AppLifecycleDisplay()),
);
}
}
class AppLifecycleDisplay extends StatefulWidget {
const AppLifecycleDisplay({super.key});
@override
State<AppLifecycleDisplay> createState() => _AppLifecycleDisplayState();
}
class _AppLifecycleDisplayState extends State<AppLifecycleDisplay> {
late final AppLifecycleListener _listener;
final ScrollController _scrollController = ScrollController();
final List<String> _states = <String>[];
late AppLifecycleState? _state;
@override
void initState() {
super.initState();
_state = SchedulerBinding.instance.lifecycleState;
_listener = AppLifecycleListener(
onShow: () => _handleTransition('show'),
onResume: () => _handleTransition('resume'),
onHide: () => _handleTransition('hide'),
onInactive: () => _handleTransition('inactive'),
onPause: () => _handleTransition('pause'),
onDetach: () => _handleTransition('detach'),
onRestart: () => _handleTransition('restart'),
// This fires for each state change. Callbacks above fire only for
// specific state transitions.
onStateChange: _handleStateChange,
);
if (_state != null) {
_states.add(_state!.name);
}
}
@override
void dispose() {
_listener.dispose();
super.dispose();
}
void _handleTransition(String name) {
setState(() {
_states.add(name);
});
_scrollController.animateTo(
_scrollController.position.maxScrollExtent,
duration: const Duration(milliseconds: 200),
curve: Curves.easeOut,
);
}
void _handleStateChange(AppLifecycleState state) {
setState(() {
_state = state;
});
}
@override
Widget build(BuildContext context) {
return Center(
child: SizedBox(
width: 300,
child: SingleChildScrollView(
controller: _scrollController,
child: Column(
children: <Widget>[
Text('Current State: ${_state ?? 'Not initialized yet'}'),
const SizedBox(height: 30),
Text('State History:\n ${_states.join('\n ')}'),
],
),
),
),
);
}
}