dartflutterjson-rpc

Flutter json_rpc_2 implementation


Did anyone successfully implemented WebSocket using json_rpc_2 package?https://pub.dartlang.org/packages/json_rpc_2

I try to present live data, e.g. a ticker, from this API: https://api.hitbtc.com/


Solution

  • Actually, I managed to solve the problem. Here's the code:

    import 'dart:convert';
    
    import 'package:flutter/material.dart';
    import 'package:json_rpc_2/json_rpc_2.dart' as json_rpc;
    import 'package:web_socket_channel/io.dart';
    
    class SymbolDetails extends StatelessWidget {
      final String symbolId;
    
      SymbolDetails({this.symbolId});
    
      @override
      Widget build(BuildContext context) {
        var _api = IOWebSocketChannel.connect('wss://api.hitbtc.com/api/2/ws');
        var client = json_rpc.Client(_api.cast());
        client.sendNotification(
          'subscribeTicker',
          {'symbol': '$symbolId'},
        );
        return Scaffold(
          appBar: AppBar(
            title: Text('$symbolId details'),
          ),
          body: StreamBuilder(
            stream: _api.stream,
            builder: (BuildContext context, AsyncSnapshot snapshot) {
              if (snapshot.connectionState == ConnectionState.none) {
                return Center(
                  child: Text('Please check your internet connection'),
                );
              } else if (!snapshot.hasData) {
                return Center(child: CircularProgressIndicator());
              }
              String _snapshotData = snapshot.data;
              Map _response = json.decode(_snapshotData);
              return ListView(
                children: [
                  ListTile(
                    title: Text('Ask price:'),
                    trailing: Text(
                      '${_response['params']['ask']}',
                      style: TextStyle(fontWeight: FontWeight.bold),
                    ),
                  ),
                  ListTile(
                    title: Text('Bid price:'),
                    trailing: Text(
                      '${_response['params']['bid']}',
                      style: TextStyle(fontWeight: FontWeight.bold),
                    ),
                  ),
                ],
              );
            },
          ),
        );
      }
    }