Flutter 中的 Android LiveData 相当于什么?
What is the equivalent of Android LiveData in Flutter?
Android 的 LiveData 允许在 activity 处于活动状态时更新 UI。因此,如果在 activity 暂停时后台操作完成,则 activity 不会收到通知,因此应用程序不会崩溃。 Flutter 可以执行相同的行为吗?
您可以使用WidgetsBindingObserver
来监听应用状态。
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');
}
}
对于对其他场景的 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 } )
并且您应该清除 dispose 中的侦听器以避免内存泄漏:
loggedInStream.close()
这段代码主要做了以下事情:
- 创建一个带有按钮的屏幕。
- 收听流(观察 LiveData)。
- 单击按钮时,它会更改值。
- 监听器(观察者)被触发
- 启动新屏幕。
无需观察App生命周期:widget只有在app恢复时才会构建
这个库完美地集成了 LiveData 概念,也有很好的文档记录。
在 Flutter 1 上开发。14.x-dev 你现在需要 master flutter 频道
Android 的 LiveData 允许在 activity 处于活动状态时更新 UI。因此,如果在 activity 暂停时后台操作完成,则 activity 不会收到通知,因此应用程序不会崩溃。 Flutter 可以执行相同的行为吗?
您可以使用WidgetsBindingObserver
来监听应用状态。
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');
}
}
对于对其他场景的 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 } )
并且您应该清除 dispose 中的侦听器以避免内存泄漏:
loggedInStream.close()
这段代码主要做了以下事情:
- 创建一个带有按钮的屏幕。
- 收听流(观察 LiveData)。
- 单击按钮时,它会更改值。
- 监听器(观察者)被触发
- 启动新屏幕。
无需观察App生命周期:widget只有在app恢复时才会构建 这个库完美地集成了 LiveData 概念,也有很好的文档记录。 在 Flutter 1 上开发。14.x-dev 你现在需要 master flutter 频道