In Flutter Как использовать провайдеров с AMQP? - PullRequest
0 голосов
/ 17 января 2020

во Флаттере - который я только недавно начал использовать - я пытаюсь использовать поток AMQP с использованием dart_amqp: ^0.1.4 и использовать провайдеров 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 всегда равен нулю.

Так что, после того, как я попробовал множество комбинаций различных провайдеров, я все еще не могу выполнить эту работу.

Буду рад, если кто-то поймет это.

С наилучшими пожеланиями!

...