Je suis nouveau dans Flutter. J'essaie de me connecter à Spring Websocket qui utilise stomp mais la connexion échoue. J'utilise stomp_dart_client 0.3.3. Spring sever fonctionne bien. Je peux voir les messages sur le navigateur.
Voici ma mise en œuvre printanière:
Classe de configuration Spring:
E/flutter (30825): [ERROR:flutter/shell/common/shell.cc(213)] Dart Error: Unhandled exception: E/flutter (30825): NoSuchMethodError: The method 'subscribe' was called on null. E/flutter (30825): Receiver: null E/flutter (30825): Tried calling: subscribe(callback: Closure: (StompFrame) => List<dynamic>, destination: "/topic/greetings", headers: null) E/flutter (30825): #0 Object.noSuchMethod (dart:core-patch/object_patch.dart:53:5) E/flutter (30825): #1 StompClient.subscribe (package:stomp_dart_client/stomp.dart:74:21) E/flutter (30825): #2 _MyHomePageState._receivedMessage (package:tutorial_projecect/main.dart:154:16) E/flutter (30825): #3 _MyHomePageState.build (package:tutorial_projecect/main.dart:90:41) E/flutter (30825): #4 StatefulElement.build (package:flutter/src/widgets/framework.dart:4619:28) E/flutter (30825): #5 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4502:15) E/flutter (30825): #6 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4675:11) E/flutter (30825): #7 Element.rebuild (package:flutter/src/widgets/framework.dart:4218:5) E/flutter (30825): #8 StatefulElement.update (package:flutter/src/widgets/framework.dart:4707:5) E/flutter (30825): #9 Element.updateChild (package:flutter/src/widgets/framework.dart:3201:15) E/flutter (30825): #10 SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:5837:14) E/flutter (30825): #11 Element.updateChild (package:flutter/src/widgets/framework.dart:3201:15) E/flutter (30825): #12 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4527:16) E/flutter (30825): #13 Element.rebuild (package:flutter/src/widgets/framework.dart:4218:5) E/flutter (30825): #14 StatelessElement.update (package:flutter/src/widgets/framework.dart:4583:5) E/flutter (30825): #15 Element.updateChild (package:flutter/src/widgets/framework.dart:3201:15) E/flutter (30825): #16 SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:5837:14) E/flutter (30825): #17 Element.updateChild (package:flutter/src/widgets/framework.dart:3201:15) E/flutter (30825): #18 SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:5837:14) E/flutter (30825): #19 Element.updateChild (package:flutter/src/widgets/framework.dart:3201:15) E/flutter (30825): #20 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4527:16) E/flutter (30825): #21 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4675:11) E/flutter (30825): #22 Element.rebuild (package:flutter/src/widgets/framework.dart:4218:5) E/flutter (30825): #23 StatefulElement.update (package:flutter/src/widgets/framework.dart:4707:5) E/flutter (30825): #24 Element.updateChild (package:flutter/src/widgets/framework.dart:3201:15) E/flutter (30825): #25 SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:5837:14) E/flutter (30825): #26 Element.updateChild (package:flutter/src/widgets/framework.dart:3201:15) E/flutter (30825): #27 SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:5837:14) E/flutter (30825): #28 Element.updateChild (package:flutter/src/widgets/framework.dart:3201:15) E/flutter (30825): #29 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4527:16) E/flutter (30825): #30 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4675:11) E/flutter (30825): #31 Element.rebuild (package:flutter/src/widgets/framework.dart:4218:5) E/flutter (30825): #32 StatefulElement.update (package:flutter/src/widgets/framework.dart:4707:5) E/flutter (30825): #33 Element.updateChild (package:flutter/src/widgets/framework.dart:3201:15) E/flutter (30825): #34 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4527:16) E/flutter (30825): #35 Element.rebuild (package:flutter/src/widgets/framework.dart:4218:5) E/flutter (30825): #36 StatelessElement.update (package:flutter/src/widgets/framework.dart:4583:5) E/flutter (30825): #37 Element.updateChild (package:flutter/src/widgets/framework.dart:3201:15) E/flutter (30825): #38 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4527:16) E/flutter (30825): #39 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4675:11) E/flutter (30825): #40 Element.rebuild (package:flutter/src/widgets/framework.dart:4218:5) E/flutter (30825): #41 StatefulElement.update (package:flutter/src/widgets/framework.dart:4707:5) E/flutter (30825): #42 Element.updateChild (package:flutter/src/widgets/framework.dart:3201:15) E/flutter (30825): #43 SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:5837:14) E/flutter (30825): #44 Element.updateCh
Contrôleur de ressort:
StompClient stompClient = StompClient( config: StompConfig( url: 'ws://10.0.2.2:7000', onConnect:(ss, dd)=> ss.subscribe ( destination: '/topic/greetings/gs-guide-websocket', callback: (StompFrame frame) { print(frame.body); }, ), onWebSocketError: (dynamic error) => print(error.toString()), onStompError: (d) => print("stomp error"), onDisconnect: (d)=> print("disconnect"), )); stompClient.activate(); stompClient.subscribe ( destination: '/topic/greetings', callback: (StompFrame frame) { print(frame.body); List<dynamic> result = json.decode(frame.body); return result; }, );
Implémentation Flutter:
@MessageMapping("/hello") @SendTo("/topic/greetings") public Greeting greeting(HelloMessage message) throws Exception { Thread.sleep(1000); // simulated delay return new Greeting("Hello, " + HtmlUtils.htmlEscape(message.getName()) + "!"); }
c'est l'erreur:
@Override public void configureMessageBroker(MessageBrokerRegistry config) { config.enableSimpleBroker("/topic"); config.setApplicationDestinationPrefixes("/app"); } @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/gs-guide-websocket").withSockJS(); }
3 Réponses :
Après quelques recherches et de nouvelles tentatives, j'ai trouvé le problème. registerStompEndpoints ne doit pas renvoyer SockJs.
Et j'ai utilisé une autre bibliothèque stomp: stomp: ^ 0.8.0
@Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/gs-guide-websocket"); }
Salut, Sed! Je suis nouveau sur Flutter aussi et j'essaie de faire exactement ce que vous avez fait. Avez-vous suivi un tutoriel que vous pourriez m'envoyer? Merci!
Votre message d'origine doit utiliser stompClient.subscribe
dans le rappel onConnect. Si vous vous abonnez avant de vous connecter, l'objet client est nul.
Depuis que vous avez changé une lib. Vous devriez montrer votre nouveau code. J'ai essayé les deux lib. Et stomp: ^ 0.8.0 donne
java.lang.IllegalArgumentException: Invalid character found in method name [STOMP0x0aaccept-version:1.20x0a0x0a...]. HTTP method names must be tokens
J'ai encore du mal à le faire fonctionner ...
En ramenant cela à l'article original qui mentionnait stomp_dart_client, j'ai eu du mal à trouver des exemples de travail pour cela sur Internet et Stack Overflow, alors voici ma solution qui peut aider.
J'utilise RabbitMQ avec le plugin Web STOMP: https://www.rabbitmq.com/web-stomp.html , en publiant des paquets JSON sur une file d'attente appelée "ping". Les exemples et les documents pour stomp_dart_client n'étaient pas clairs sur la façon de se connecter à une session sécurisée, à laquelle j'ai résolu en ajoutant une authentification dans l'en-tête:
import 'dart:convert'; import 'package:stomp_dart_client/stomp.dart'; import 'package:stomp_dart_client/stomp_config.dart'; import 'package:stomp_dart_client/stomp_frame.dart'; dynamic onConnect(StompClient client, StompFrame frame) { client.subscribe( destination: 'ping', callback: (StompFrame frame) { var jsonData = json.decode(frame.body); print(jsonData); }); } final stompClient = StompClient( config: StompConfig( url: 'ws://x.x.x.x:15674/ws', onConnect: onConnect, onWebSocketError: (dynamic error) => print(error.toString()), stompConnectHeaders: { 'login': 'someuserlogin', 'passcode': 'somepassword' }, )); void main() { stompClient.activate(); }