微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为 Flutter 创建多个 Laravel Echo 实例 代码片段:在一页中聆听示例

如何解决为 Flutter 创建多个 Laravel Echo 实例 代码片段:在一页中聆听示例

我正在尝试使用此包在 Flutter 应用程序中添加 websocketslaravel_echo: ^0.2.9

我的应用程序中有通知和消息,所以如果我只为这两个创建 websocket,它工作正常。但是,如果我添加第二个 websocket,它们都会停止工作。

代码片段:

pusher_socket.dart


class PusherSocket {
  
   Echo socket({ String authToken }){

        PusherAuth _auth = PusherAuth(
          'https://api.example.com/broadcasting/auth',headers: {
            'Authorization': '$authToken',},);
        

      PusherOptions options = PusherOptions(
        host: "api.example.com",port: 6003,encrypted: true,auth: _auth,cluster: "CLT",);

      FlutterPusher pusher = FlutterPusher("MY_KEY",options,enableLogging: false );

      return new Echo({
        'broadcaster': 'pusher','client': pusher,});
  }
}

在一页中聆听

注意:我想在不同的页面中使用此代码

Echo echo = new PusherSocket().socket(authToken: conversationProvider.authToken);

echo
    .join("conversation.${conversationProvider.conversation.id}")
    .listen('NewMessage',(data) {
    print(data);
    try {
        final message = data;

        Message _message = Message.fromJson(message);

        conversationProvider.addMessage(message: _message);
    } catch (error) {
        
    }
});

我做错了什么吗?

解决方法

基本上您不需要为此创建两个 websockets 实例。您可以创建一个全局 websocket,然后在整个应用程序中使用它。

示例。

这里我在 websocket 中实例化了 AuthProvider 因为我知道 AuthProvider 将包含在应用程序的根目录中,使其可用于所有子 Widgets

pusher_socket.dart

class PusherSocket {
  
   Echo socket({ String authToken }){

        PusherAuth _auth = PusherAuth(
          'https://api.example.com/broadcasting/auth',headers: {
            'Authorization': '$authToken',},);
        

      PusherOptions options = PusherOptions(
        host: "api.example.com",port: 6003,encrypted: true,auth: _auth,cluster: "CLT",);

      FlutterPusher pusher = FlutterPusher("MY_KEY",options,enableLogging: false );

      return new Echo({
        'broadcaster': 'pusher','client': pusher,});
  }
}

auth_provider.dart


class AuthProvider with ChangeNotifier {
  String authToken;
  Echo echo;

  
  Future<void> sigin({@required email,@required password}) async {

      /**
       * the logic for login
       * goes here
       */

      // Set echo if not set
      if (echo == null && authToken != null) {
        echo = PusherSocket().socket(authToken: authToken);
        print("Prepare echo");
      }

      //notify others
      notifyListeners();
  }

conversation_page.dart


final authProvider = Provider.of<AuthProvider>(context);

authProvider.echo
    .join("conversation.${conversationProvider.conversation.id}")
    .listen('NewMessage',(data) {
    print(data);
    try {
        final message = data;

        Message _message = Message.fromJson(message);

        conversationProvider.addMessage(message: _message);
    } catch (error) {
        
    }
});

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。