如何从普通班级发布观察者并接收小部件的侦听器?

时间:2019-10-17 11:28:27

标签: flutter dart

我对Flutter并不陌生,正在尝试使用SDK。我正在使用可与Socket连接配合使用的flutter应用程序。我看到了很多与小部件之间进行通信的示例。但是,我想将侦听器从Socket类添加到小部件。实际情况是,我的套接字管理器类中有套接字侦听器。这是一个更好的主意的代码。

  class SocketManager {

   static SocketIO socketIO;
   static SocketIOManager manager = SocketIOManager();

   //Constructor
   SocketManager(){
     initSocket().then((socketIO){
       addListener();
     });
   }

   void addListener(){
      socketIO.onConnect((data){
      print("connected...");
   });

   }

  }  

我想在套接字连接时通知我的窗口小部件。 我想要实现这种东西是什么?

谢谢。

2 个答案:

答案 0 :(得分:0)

这是我的课程,您可以按照以下步骤创建您的课程

    import 'dart:convert';
import 'package:flutter_app/global.dart';
import 'package:flutter_app/strings.dart';
import 'package:rxdart/subjects.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:socket_io_client/socket_io_client.dart' as IO;



IO.Socket kSocket;

class Sockets {
  static PublishSubject socket = PublishSubject(sync: true);
  static PublishSubject status = PublishSubject(sync: true);
  static PublishSubject notify = PublishSubject(sync: true);
  static PublishSubject chatCount = PublishSubject(sync: true);
  static PublishSubject typing = PublishSubject(sync: true);
  static PublishSubject login = PublishSubject(sync: false);
  static PublishSubject getInfo = PublishSubject(sync: true);
  static PublishSubject alreadyLogin = PublishSubject(sync: false);
  static void connectSocket() async {
    /* kSocket = await IO.io('${Strings.socket}', <String, dynamic>{
      'transports': ['websocket', 'polling'],
    });*/
    SharedPreferences prefs = await SharedPreferences.getInstance();
    String token = prefs.getString('userToken');

    if (token != null && token != '') {
      Map<String, dynamic> parsedToken = Functions.parseJwt(token);

      String imza = token?.split('.')[2];
      kSocket = await IO.io('${Strings.socket}', <String, dynamic>{
        'transports': ['websocket', 'polling'],
        'query': 'token=$imza'
      });

      parsedToken['Tur'] = 2;
      kSocket.close();
      kSocket.disconnect();
      kSocket.open();
      try {
        kSocket.on('connect', (data) {
          print('SOCKET CONNECTED');
          kSocket.emit('adduser', parsedToken);
          kSocket.on('getmessage', (res) {
            print('GETMSG: $res');
            chatCount.sink.add(res);
            socket.sink.add(res);
          });
          kSocket.on('bildirim', (res) {
            print('[BILDIRIM]: $res');
            notify.sink.add(res);
          });
          kSocket.on('durum', (res) {
            status.sink.add(res);
          });

          kSocket.on('disconnect', (data) {
           // print('DISCONNECT: $data');
          });

          kSocket.on('typing', (res) {
            typing.sink.add(res);
          });

          kSocket.on('login', (res) {
            //print('Multi Login');
            login.sink.add(res);
          });

          kSocket.on('getinfo', (res) {
            //print('GETINFO: $res');
            getInfo.sink.add(res);
          });

          kSocket.on('alreadylogin', (res) {
            //print('ALREADY LOGIN: $res');
            alreadyLogin.sink.add(res);
          });
        });
      } catch (e) {
        print(e);
      }
    } else {
      print('SOCKET: token yok');
    }
  }

  static void setInfo(Map<String, dynamic> data) {
    kSocket.emit('setinfo', [data]);
  }

  static void setRead(String userid) {
    kSocket.emit('setreaded', '$userid');
  }

  static void isTyping(String username, int status) {
    kSocket.emit('istyping', [
      {"user": int.parse(username), "durum": status}
    ]);
  }

  static void isActive(String userid) {
    if (kSocket != null) {
      if (kSocket.connected) {
        try {
          //print('${kSocket.connected}');
          kSocket.emit('isactive', '$userid');
        } catch (e) {
          print(e);
        }
      }
    }
  }

  static void disconnectSocket() async {
    try {
      await kSocket.disconnect();
      await kSocket.close();
      await kSocket.destroy();
      print('SOCKET DISCONNECTED');
    } catch (e) {
      //print(e);
    }
  }

  static void dispose(){
    socket.close();
    status.close();
    //notify.close();
    chatCount.close();
    typing.close();
    login.close();
    getInfo.close();
    alreadyLogin.close();
  }

  static void unSubNotify(){
    notify.close();
  }

}

答案 1 :(得分:0)

答案在这里!这是我在网上冲浪时发现的。 Flutter-NotificationCenter。 IOS类型的发布和接收观察者。对于想要在任何地方发布观察者并希望将其接收到任何地方的其他开发人员来说,这很有帮助。