现在,小部件仅具有initeState() 和dispose(),该initeState()在第一次创建小部件时被触发,而dispose()在小部件 被破坏时被触发。有没有一种方法可以检测小部件何时回到 前台?当一个小部件由于另一个 小部件刚刚被前景显示而将要进入后台时?这等效 于Android触发onResume和onPause ,以及ios触发viewWillAppear和viewWillDisappear
最常见的情况是,如果您正在运行动画并且不想在后台消耗资源。在这种情况下,你应该延长您的State使用TickerProviderStateMixin,并使用你的State作为vsync的说法AnimationController。当您State可见时,Flutter 只会处理动画控制器的侦听器。
State
TickerProviderStateMixin
vsync
AnimationController
Flutter
如果你想State住在你的S PageRoute当被置于PageRoute被其他内容遮挡,可以传递的参数,以您的构造函数。如果执行此操作,则隐藏时将重置自身(及其子代),并且必须使用作为 其构造函数参数传入的属性来 重新构造自身。如果您不希望 完全重置 ,则可以使用模型或控制器类或来保存用户的进度信息。 maintainState falsePageRoute State initState widget PageStorage
maintainState
falsePageRoute
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, ), ], ), ); } }