mqtt_cubit.dart 2.29 KB
import 'package:appframe/config/db.dart';
import 'package:appframe/config/locator.dart';
import 'package:appframe/config/routes.dart';
import 'package:appframe/services/mqtt_service.dart';
import 'package:equatable/equatable.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:mqtt_client/mqtt_client.dart';

class MqttState extends Equatable {
  final List<String> messages;

  const MqttState({this.messages = const []});

  MqttState copyWith({List<String>? messages}) {
    return MqttState(
      messages: messages ?? this.messages,
    );
  }

  @override
  List<Object?> get props => [messages];
}

class MqttCubit extends Cubit<MqttState> with WidgetsBindingObserver {
  late MqttService _mqttService;

  MqttCubit() : super(MqttState()) {
    _mqttService = getIt.get<MqttService>();
    _mqttService.listen(_onMessageReceived);
    WidgetsBinding.instance.addObserver(this);
  }

  void goWeb() {
    router.go('/web');
  }

  @override
  Future<void> didChangeAppLifecycleState(AppLifecycleState state) async {
    super.didChangeAppLifecycleState(state);
    // print('----------------------didChangeAppLifecycleState------------------------------');
    if (state == AppLifecycleState.resumed) {
      // print('----------------------resumed------------------------------');
      if (!_mqttService.isConnected()) {
        // print('----------------------reconnected------------------------------');
        await _mqttService.initConn();
        _mqttService.listen(_onMessageReceived);
      }
    }
  }

  Future<void> _onMessageReceived(List<MqttReceivedMessage<MqttMessage?>>? c) async {
    final recMess = c![0].payload as MqttPublishMessage;
    final pt = MqttPublishPayload.bytesToStringAsString(recMess.payload.message);
    print('-------------------------> $pt');

    // Map<String, dynamic> data = {"id": 1, "content": pt};
    // bxeDb.insert('msg', data);
    //
    // var msgList = await bxeDb.query('msg');
    // for (var msg in msgList) {
    //   print('-------------------------> $msg');
    // }

    // 处理接收到的消息
    emit(state.copyWith(messages: [...state.messages, pt]));


  }

  @override
  Future<void> close() {
    // 关闭时移除观察者
    WidgetsBinding.instance.removeObserver(this);
    return super.close();
  }
}