Android的LiveData允许在活动处于活动状态时更新UI。因此,如果在活动暂停时后台操作已完成,则不会通知活动,因此应用程序不会粉碎。 Flutter可以执行相同的行为吗?
答案 0 :(得分:2)
您可以使用WidgstsBindingObserver
收听应用程序状态。
class AppLifecycleReactor extends StatefulWidget {
const AppLifecycleReactor({ Key key }) : super(key: key);
@override
_AppLifecycleReactorState createState() => new _AppLifecycleReactorState();
}
class _AppLifecycleReactorState extends State<AppLifecycleReactor> with WidgetsBindingObserver {
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
AppLifecycleState _notification;
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
setState(() { _notification = state; });
}
@override
Widget build(BuildContext context) {
return new Text('Last notification: $_notification');
}
}
答案 1 :(得分:1)
对于在其他情况下对等效LiveData感兴趣的人,我向您介绍StreamController:
class ExampleViewModel {
StreamController<bool> loggedInStream = StreamController<bool>();
logIn() { loggedInStream.add(true); }
}
class ExampleScreen extends StatefulWidget {
@override
State<StatefulWidget> createState() => ExampleScreenState();
}
class ExampleScreenState extends State<ExampleScreen> {
ExampleViewModel _viewModel;
BuildContext _ctx;
@override
void initState() {
super.initState();
_viewModel = ExampleViewModel()
_viewModel.loggedInStream.stream.listen( (loggedIn) {
if ( loggedIn != null && loggedIn ) {
Navigator.of(_ctx).pushReplacementNamed("/home");
}
});
}
@override
Widget build(BuildContext context) {
_ctx = context;
var loginBtn =
RaisedButton(
onPressed: _viewModel.logIn(true),
child: Text(
"LOGIN",
style: new TextStyle(
fontSize: 24.0,
)
),
color: Colors.green,
textColor: Colors.white,
);
return loginBtn;
}
@override
void dispose() {
super.dispose();
_viewModel.loggedInStream.close();
}
}
您可以使用以下方式像LiveData一样订阅它:
loggedInStream.stream.listen( (data) { code } )
并且您应该清除监听器以免发生内存泄漏:
loggedInStream.close()
此代码基本上执行以下操作:
答案 2 :(得分:0)
无需观察应用程序生命周期:仅在应用程序恢复时才构建小部件 这个库完美地集成了 LiveData 概念,也有很好的文档记录。 在 Flutter 1.14.x-dev 上开发,您目前需要掌握 Flutter 频道