現在、ウィジェットには、ウィジェットが初めて作成されたときにトリガーされるiniteState()と、ウィジェットが破棄されたときにトリガーされるdispose()のみがあります。ウィジェットがフォアグラウンドに戻ったときを検出する方法はありますか?また、別のウィジェットがフォアグラウンドになったために、ウィジェットがバックグラウンドに移動しようとしているときAndroidではonResumeとonPauseがトリガーされ、iosではviewWillAppearとviewWillDisappearがトリガーされます。
これを行いたい最も一般的なケースは、アニメーションを実行していて、バックグラウンドでリソースを消費したくない場合です。その場合、State
をTickerProviderStateMixin
で拡張し、State
のvsync
引数としてAnimationController
を使用する必要があります。 Flutterは、State
が表示されている場合にのみ、アニメーションコントローラーのリスナーを呼び出します。
State
が他のコンテンツによって隠されているときにPageRoute
にあるPageRoute
sを破棄する場合は、maintainState
の false
引数をPageRoute
コンストラクターに渡すことができます。これを行うと、State
は非表示になるとそれ自体(およびその子)をリセットし、initState
にコンストラクター引数として渡されるプロパティを使用してwidget
で再構築する必要があります。モデルまたはコントローラークラス、または PageStorage
を使用して、完全にリセットしたくない場合にユーザーの進行情報を保持できます。
これらの概念を示すサンプルアプリを次に示します。
import 'package:flutter/material.Dart';
void main() {
runApp(new MaterialApp(
onGenerateRoute: (RouteSettings settings) {
if (settings.name == '/') {
return new MaterialPageRoute<Null>(
settings: settings,
builder: (_) => new MyApp(),
maintainState: false,
);
}
return null;
}
));
}
class MyApp extends StatefulWidget {
MyAppState createState() => new MyAppState();
}
class MyAppState extends State<MyApp> with TickerProviderStateMixin {
AnimationController _controller;
@override
void initState() {
print("initState was called");
_controller = new AnimationController(vsync: this)
..repeat(min: 0.0, max: 1.0, period: const Duration(seconds: 1))
..addListener(() {
print('animation value ${_controller.value}');
});
super.initState();
}
@override
void dispose() {
print("dispose was called");
_controller.dispose();
super.dispose();
}
int _counter = 0;
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text('home screen')
),
body: new Center(
child: new RaisedButton(
onPressed: () {
setState(() {
_counter++;
});
},
child: new Text('Button pressed $_counter times'),
),
),
floatingActionButton: new FloatingActionButton(
child: new Icon(Icons.remove_red_eye),
onPressed: () {
Navigator.Push(context, new MaterialPageRoute(
builder: (BuildContext context) {
return new MySecondPage(counter: _counter);
},
));
},
),
);
}
}
class MySecondPage extends StatelessWidget {
MySecondPage({ this.counter });
final int counter;
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text('Certificate of achievement'),
),
body: new Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
new Icon(Icons.developer_mode, size: 200.0),
new Text(
'Congrats, you clicked $counter times.',
style: Theme.of(context).textTheme.title,
textAlign: TextAlign.center,
),
new Text(
'All your progress has now been lost.',
style: Theme.of(context).textTheme.subhead,
textAlign: TextAlign.center,
),
],
),
);
}
}
抽象クラスの呼び出し元WidgetsBindingObserverがあります
https://docs.flutter.io/flutter/widgets/WidgetsBindingObserver-class.html
に
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
setState(() {
_notification = state;
});
}
「状態」があり、として管理することができます
switch(state) {
case AppLifecycleState.resumed:
// Handle this case
break;
case AppLifecycleState.inactive:
// Handle this case
break;
case AppLifecycleState.paused:
// Handle this case
break;
case AppLifecycleState.suspending:
// Handle this case
break;
}