【问题标题】:How to post observer from normal class and receive listener to widget?如何从普通班级发布观察者并接收小部件的侦听器?
【发布时间】:2019-10-17 11:28:27
【问题描述】:

我对 Flutter 很陌生,并且正在尝试使用 SDK。我正在使用与 Socket 连接一起使用的颤振应用程序。我看到了很多与小部件到小部件通信的示例。但是,我想将 Socket 类中的侦听器添加到小部件。实际情况是,我的套接字管理器类中有 套接字侦听器。这是更好的想法的粗略代码。

  class SocketManager {

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

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

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

   }

  }  

我想在套接字连接时通知我的小部件。 我在寻找什么样的东西来实现这个?

提前致谢。

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    这是我的课程,你可以跟着创建你的

        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();
      }
    
    }
    

    【讨论】:

    • socket 连接时如何通知小部件?
    • kSocket.isConnected
    • 我想在建立套接字连接时从小部件调用函数。希望你能理解我的问题。
    • PublishSubjects 就像一个流,你可以在你的页面中使用 streambuilder 来监听它们,然后在那里进行一些操作或者:notifySubject.listen((res){ //do some event here })
    • 能给我一些代码吗?因为我是 streambuilder 的新手。
    【解决方案2】:

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

    【讨论】:

    • 也许是一个显而易见的答案,但最新版本在哪里列出?所以我可以将它添加到依赖项列表中。
    • 不支持依赖。只需复制 notification_center.dart 文件并添加到您的项目中。如果有帮助请点赞!
    猜你喜欢
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    相关资源
    最近更新 更多