Flutter中的Android LiveData相当于什么?

时间:2018-05-05 21:27:52

标签: flutter android-livedata

Android的LiveData允许在活动处于活动状态时更新UI。因此,如果在活动暂停时后台操作已完成,则不会通知活动,因此应用程序不会粉碎。 Flutter可以执行相同的行为吗?

3 个答案:

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

此代码基本上执行以下操作:

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

答案 2 :(得分:0)

简单:Flutterx Live Data

无需观察应用程序生命周期:仅在应用程序恢复时才构建小部件 这个库完美地集成了 LiveData 概念,也有很好的文档记录。 在 Flutter 1.14.x-dev 上开发,您目前需要掌握 Flutter 频道