AS-Devs / signalr_flutter

A flutter plugin for .net SignalR client.
https://pub.dev/packages/signalr_flutter
MIT License
19 stars 27 forks source link

Not receiving message from server (Hub) to flutter client #24

Closed FirozRangrez closed 3 years ago

FirozRangrez commented 3 years ago

I have connected two clients(.Net Console and flutter) in hub and trying to have conversation between them. When I am sending message from flutter client to server the message is populated in console but when i am trying to send message from console client the message is not populating in flutter

Flutter Client code:

import 'package:flutter/material.dart';
import 'dart:async';
import 'package:signalr_flutter/signalr_flutter.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _signalRStatus = 'Unknown';
  SignalR signalR;
  final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();

  @override
  void initState() {
    super.initState();
    initPlatformState();
  }

  // Platform messages are asynchronous, so we initialize in an async method.
  Future<void> initPlatformState() async {
    signalR = SignalR('http://192.168.10.12:50755/', 'NotificationHub',
        hubMethods: ["Send", "SendMessageToAllClients"],
        statusChangeCallback: _onStatusChange,
        // hubCallback: _onNewMessage);
        hubCallback: _onNewMessage);
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        key: _scaffoldKey,
        appBar: AppBar(
          title: const Text('SignalR Plugin Example App'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text('Connection Status: $_signalRStatus\n',
                  style: Theme.of(context).textTheme.headline5),
              Padding(
                padding: const EdgeInsets.only(top: 20.0),
                child: RaisedButton(
                    onPressed: _buttonTapped, child: Text("Invoke Method")),
              )
            ],
          ),
        ),
        floatingActionButton: FloatingActionButton(
          child: Icon(Icons.cast_connected),
          onPressed: () async {
            await signalR.connect();
          },
        ),
      ),
    );
  }

  _onStatusChange(dynamic status) {
    if (mounted) {
      setState(() {
        _signalRStatus = status as String;
      });
    }
  }

  _onNewMessage(String methodName, dynamic message) {
    print('MethodName = $methodName, Message = $message');
  }

  _buttonTapped() async {
    dynamic finalValue;
    signalR.invokeMethod<HubMes>("Send",
        arguments: ["Flutter", "From flutter"]).catchError((error) {
      print(error.toString());
    }).then((value) {
      finalValue = value;
      print(value);
    });

    final snackBar =
        SnackBar(content: Text('SignalR Method Response: $finalValue'));
    _scaffoldKey.currentState.showSnackBar(snackBar);
  }
}

class HubMes {
  final name;
  final message;
  HubMes(this.name, this.message);
}

.Net Server code

public class NotificationHub : Hub
    {
       // I have used this line to store list of connected users
        public static ConcurrentDictionary<string, MyUserType> MyUsers = new ConcurrentDictionary<string, MyUserType>();

        public override Task OnConnected()
        {
            MyUsers.TryAdd(Context.ConnectionId, new MyUserType() { ConnectionId = Context.ConnectionId });
            return base.OnConnected();
        }

        public override Task OnDisconnected(bool stopCalled)
        {
            MyUserType garbage;

            MyUsers.TryRemove(Context.ConnectionId, out garbage);

            return base.OnDisconnected(stopCalled);
        }

        public void SendMessageToAllClients()
        {
            var listOfIds = MyUsers.Keys.ToList();
            Clients.Client(listOfIds[0]).SendAsync("initsignal", "THis is message to server");
            Clients.Client(listOfIds[1]).SendAsync("initsignal", "THis is message to server");
        }
        // This message is used to send message to clients
        public void Send(string name, string message)
        {
            Debug.WriteLine(name + " " + message);
            Clients.All.broadcastMessage(name, $"{message}");
            Clients.Others.newMessage(new HubMes(name, message));
        }
    }
    public class MyUserType
    {
        public string ConnectionId { get; set; }
        // Can have whatever you want here
    }
    public class HubMes
    {
        public HubMes(string _name, string _mes)
        {
            name = _name;
            message = _mes;
        }
        public string name { get; set; }
        public string message { get; set; }
    }