在Flutter中如何将提供程序与AMQP一起使用?

时间:2020-01-17 04:45:31

标签: flutter dart amqp provider

在我刚刚开始使用的Flutter中,我正在尝试通过dart_amqp: ^0.1.4使用AMQP流并使用提供程序provider: ^3.1.0+1使数据在整个应用程序中可用。

仅在登录后才启动AMQP服务。 AMQP部分工作正常,没有问题,我得到了数据,但从未设法与提供程序一起使用。

main.dart

class BigBrother extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider<EventsModel>(create: (_) => EventsModel()),
        ChangeNotifierProxyProvider<EventsModel, DeviceState>(
          create: (_) => new DeviceState(),
          update: (context, eModel, deviceState) {
            deviceState.updateFromEvent(eModel.value);
          },
       ),
     ],

我在 models.dart 中的模型 (如下面的代码所示,我还尝试使用StreamProvider并将其注释掉)

// Global data model
class DeviceState with ChangeNotifier {
  Map<String, Map<String, dynamic>> state = {};
  DeviceState() {
    this.state['xxx'] = {};
    this.state['yyy'] = {};
  }

  updateFromEvent(EventsItemModel event) {
    if (event != null && event.type != null) {
      switch (event.type) {
        case 'heartbeat':
          this.state[event.device][event.type] = event.createdAt;
          break;
        case 'metrics':
          this.state[event.device][event.type] = {}
            ..addAll(this.state[event.device][event.type])
            ..addAll(event.message);
          break;
      }
      notifyListeners();
    }
  }
}


class EventsModel with ChangeNotifier {
  EventsItemModel value;
  bool isSubscribed = false;
  AMQPModel _amqp = new AMQPModel();
  // final _controller = StreamController<EventsItemModel>();

  EventsModel();

  // Stream<EventsItemModel> get stream => _controller.stream;

  _set(String jsonString) {
    value = new EventsItemModel.fromJson(jsonString);

//    _controller.sink.add(value); // send data to stream
//    Provider.of<DeviceState>(context, listen: false).updateFromEvent(value);

    notifyListeners();
  }

  subscribe() {
    if (!this.isSubscribed) {
      this.isSubscribed = true;
      this._amqp.subscribeEvents(_set); // start AMQP service after login
    }
  }
}

因此,在 login.dart 视图上,在按下按钮并验证登录名的情况下,我启动了AMQP流:

onPressed: () {
  if (_formKey.currentState.validate()) {
    print("Login button onPressed");
    Provider.of<EventsModel>(context, listen: false)
                          .subscribe();
    Navigator.pushReplacementNamed(context, Routes.live);
}

最后是成功登录后的视图:

class _LivePageState extends State<LivePage> {
  @override
  Widget build(BuildContext context) {
    DeviceState deviceState = Provider.of<DeviceState>(context);

    print('#### Device state updated');
    print(deviceState.state['xxx']);

在上面的代码中, deviceState 始终为空。

因此,在尝试了各种提供程序的许多组合之后,我仍然无法完成这项工作。

很高兴有人对此有所了解。

最诚挚的问候!

0 个答案:

没有答案