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()

这段代码主要做了以下事情:

  1. 创建一个带有按钮的屏幕。
  2. 收听流(观察 LiveData)。
  3. 单击按钮时,它会更改值。
  4. 监听器(观察者)被触发
  5. 启动新屏幕。

简单:Flutterx Live Data

无需观察App生命周期:widget只有在app恢复时才会构建 这个库完美地集成了 LiveData 概念,也有很好的文档记录。 在 Flutter 1 上开发。14.x-dev 你现在需要 master flutter 频道