0

I have a stock marketing project which uses web socket connection, so in order to get the continuous response I have been using bloc consumer("flutter_bloc").

But I am not able to parse the response from the socket , so is there any blog or any other reference regarding the same.

home_screen.dart

    homeBloc = BlocProvider.of<HomeBloc>(context);
    homeBloc.add(FetchHomeEvent());
    homeBloc.listenMessages();
...

  @override
  Widget build(BuildContext context) {
    return BlocProvider(
   create: (context) => HomeBloc(HomeLoadedState()),
  child: Scaffold();

home_bloc.dart

class HomeBloc extends Bloc<HomeEvent, HomeState> {
  List<Home> homeList = [];
  Home sendMessage=Home(id:'50003');
  // HomeBloc():super[];
  final TextEditingController messageTextTextEditingController=TextEditingController();

  HomeBloc(HomeState initialState) : super(initialState);

  HomeState get initialState=>HomeInitial();


  final IOWebSocketChannel channel=IOWebSocketChannel.connect(ConstantBaseUrls.baseUrlWs);

  final BehaviorSubject<String> messageTextBehaviorSubject=BehaviorSubject<String>();
  Stream<String> get messageTextStream=>messageTextBehaviorSubject.stream;
  StreamSink<String> get messageTextStreamSink=>messageTextBehaviorSubject.sink;

  void dispose()  {
    channel.closeCode;
    messageTextBehaviorSubject.close();
    messageTextTextEditingController.dispose();
  }



  @override
  Stream<HomeState> mapEventToState(HomeEvent event) async* {

    if(event is FetchHomeEvent)  {
      print('~~~ FetchDirectEvent');
      yield* mapFetchHomeEventToState(event);
    }
   
  }
  Stream<HomeState> mapFetchHomeEventToState(FetchHomeEvent event) async* {
    try {
      yield HomeLoadedState(homeList: homeList);
    } catch(e)  {
      print('~~init: ${e.toString()}');
      // Screen.showToast(e.toString());
    }
  }

  void listenMessages()async {
    channel.stream.listen((data) async {
      print('~~~ data: ${data.runtimeType} $data len: ${homeList.length}');
      homeList.add(Home.fromJson(jsonDecode(data)));
      print('~~~ 2 len: ${homeList.length}');
      add(FetchHomeEvent());
    });
  }

}

home_event.dart

abstract class HomeEvent {}

class FetchHomeEvent extends HomeEvent  {
  FetchHomeEvent();

  List<Object> get props=>[];

}

home_state.dart


abstract class HomeState {}

class HomeInitial extends HomeState {

  List<Object> get props=>[];
}

class HomeLoadedState extends HomeState {
  List<Home>? homeList;

  HomeLoadedState({this.homeList});

  List<Object> get props=>[homeList!];
}


class HomeErrorState extends HomeState  {

  String? id;
  String? company;
  String? time;
  String? text;
  List<Home>? homeList;

  HomeErrorState({this.id, this.company, this.text, this.time});

  List<Object> get props=>[homeList!, id! , company! , time!, text!];
}

Access the key in response and update my UI as per the response again and again as the stock value changes

1 Answers1

0

Try looking into StreamBuilder, it would be much more adequate than BlocConsumer/BlocBuilder.

Rukka
  • 350
  • 1
  • 9