во Флаттере - который я только недавно начал использовать - я пытаюсь использовать поток 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 всегда равен нулю.
Так что, после того, как я попробовал множество комбинаций различных провайдеров, я все еще не могу выполнить эту работу.
Буду рад, если кто-то поймет это.
С наилучшими пожеланиями!