Skip to content

Commit be07798

Browse files
committed
chore: simplifying the UserDataProfileControllerV2 - WIP
1 parent 0ca9c45 commit be07798

File tree

4 files changed

+114
-9
lines changed

4 files changed

+114
-9
lines changed

lib/binding/initial_binding.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import 'package:getx_websocket_example/controller/home_controller.dart';
33
import 'package:getx_websocket_example/controller/user_data_profile.controller_v1.dart';
44
import 'package:getx_websocket_example/controller/user_data_profile.controller_v2.dart';
55
import 'package:getx_websocket_example/services/data.service.dart';
6+
import 'package:getx_websocket_example/services/data.service_v2.dart';
67
import 'package:getx_websocket_example/services/logging.service.dart';
78

89
class InitialBinding extends Bindings {
@@ -12,6 +13,7 @@ class InitialBinding extends Bindings {
1213
void dependencies() {
1314
logger.i("InitialBinding");
1415
Get.put<DataService>(DataService());
16+
Get.put<DataService2>(DataService2());
1517
Get.put<UserDataProfileControllerV1>(UserDataProfileControllerV1());
1618
Get.put<UserDataProfileControllerV2>(UserDataProfileControllerV2());
1719
Get.put<HomeController>(HomeController());

lib/services/data.service.dart

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,23 @@ import 'package:web_socket_channel/web_socket_channel.dart';
88

99
import 'logging.service.dart';
1010

11+
enum Status { loading, error, success }
12+
1113
class DataService extends GetxService {
14+
WebSocketChannel _channel;
15+
1216
final _logger = LoggingService().logger;
1317
final Rx<UserDataProfile> _userDataProfile = UserDataProfile().obs;
18+
final Rx<Status> _userDataProfileStatus = Status.loading.obs;
1419

15-
WebSocketChannel _channel;
16-
ObserverList<Function> _listeners = new ObserverList<Function>();
17-
LinkedHashSet _listenerSet = new LinkedHashSet();
20+
final ObserverList<Function> _listeners = new ObserverList<Function>();
21+
final LinkedHashSet _listenerSet = new LinkedHashSet();
1822

1923
Rx<UserDataProfile> fetchUserDataProfile() {
2024
Function _fetchUserDataProfileCallback = (Map<String, dynamic> _messageEventMap, String _uuid) {
2125
if (_messageEventMap['event'] == '/identity/$_uuid') {
2226
_userDataProfile(UserDataProfile.fromJson(_messageEventMap['data']));
27+
_userDataProfileStatus(Status.success);
2328
_logger.d('---------------userProfile.1: ${_userDataProfile.value.uuid}');
2429
}
2530
};

lib/services/data.service_v2.dart

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
import 'dart:collection';
2+
import 'dart:convert';
3+
4+
import 'package:flutter/foundation.dart';
5+
import 'package:get/get.dart';
6+
import 'package:getx_websocket_example/model/user-data-profile.entity.dart';
7+
import 'package:web_socket_channel/web_socket_channel.dart';
8+
9+
import 'logging.service.dart';
10+
11+
enum Status { loading, error, success }
12+
13+
class DataService2 extends GetxService {
14+
Worker _getxWorker;
15+
WebSocketChannel _channel;
16+
17+
final _logger = LoggingService().logger;
18+
final Rx<UserDataProfile> userDataProfile = UserDataProfile().obs;
19+
final Rx<Status> userDataProfileStatus = Status.loading.obs;
20+
21+
final ObserverList<Function> _listeners = new ObserverList<Function>();
22+
final LinkedHashSet _listenerSet = new LinkedHashSet();
23+
24+
void fetchUserDataProfile() {
25+
Function _fetchUserDataProfileCallback = (Map<String, dynamic> _messageEventMap, String _uuid) {
26+
if (_messageEventMap['event'] == '/identity/$_uuid') {
27+
userDataProfile(UserDataProfile.fromJson(_messageEventMap['data']));
28+
userDataProfileStatus(Status.success);
29+
_logger.d('---------------userProfile.1: ${userDataProfile.value.uuid}');
30+
}
31+
};
32+
33+
String uuid = "xyz";
34+
String rawJson = '{ "event": "/identity/$uuid", "data": { "uuid": "$uuid", "name": "John Doe", "email": "[email protected]" } }';
35+
36+
_addListener(uuid, (messageEventMap) => _fetchUserDataProfileCallback(messageEventMap, uuid));
37+
_send(rawJson);
38+
}
39+
40+
_connect() async {
41+
final _wsUrl = 'wss://echo.websocket.org';
42+
if (_channel == null) {
43+
_logger.d('Connecting ...');
44+
_channel = WebSocketChannel.connect(Uri.parse(_wsUrl));
45+
_channel.stream.where((event) => event != null).map((event) => jsonDecode(event) as Map<String, dynamic>).where((eventMap) => eventMap['data'] != '404').listen(_onMessage);
46+
}
47+
}
48+
49+
_send(String message) {
50+
if (_channel != null) {
51+
if (_channel.sink != null) {
52+
_channel.sink.add(message);
53+
}
54+
}
55+
}
56+
57+
// ---------------------------------------------------------
58+
/// Adds a callback to be invoked in case of incoming
59+
/// notification
60+
/// ---------------------------------------------------------
61+
_addListener(String id, Function callback) {
62+
if (!_listenerSet.contains(id)) _listeners.add(callback);
63+
_listenerSet.add(id);
64+
}
65+
66+
_removeListener(Function callback) {
67+
_listeners.remove(callback);
68+
}
69+
70+
/// ----------------------------------------------------------
71+
/// Callback which is invoked each time that we are receiving
72+
/// a message from the server
73+
/// ----------------------------------------------------------
74+
_onMessage(message) {
75+
_listeners.forEach((Function callback) {
76+
callback(message);
77+
});
78+
}
79+
80+
/// ----------------------------------------------------------
81+
/// Closes the WebSocket communication
82+
/// ----------------------------------------------------------
83+
_reset() {
84+
if (_channel != null) {
85+
if (_channel.sink != null) {
86+
_logger.d('Closing connection ...');
87+
_channel.sink.close();
88+
_connect();
89+
}
90+
}
91+
}
92+
93+
@override
94+
void onInit() {
95+
super.onInit();
96+
_connect();
97+
}
98+
}

lib/view/detail.dart

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import 'package:flutter/material.dart';
22
import 'package:get/get.dart';
3-
import 'package:getx_websocket_example/controller/user_data_profile.controller_v2.dart';
3+
import 'package:getx_websocket_example/services/data.service_v2.dart';
44
import 'package:getx_websocket_example/services/logging.service.dart';
55

6-
class DetailScreen extends GetWidget<UserDataProfileControllerV2> {
6+
class DetailScreen extends GetWidget<DataService2> {
77
final logger = LoggingService().logger;
88

99
@override
@@ -13,10 +13,10 @@ class DetailScreen extends GetWidget<UserDataProfileControllerV2> {
1313
return Scaffold(
1414
appBar: AppBar(
1515
title: Obx(() {
16-
if (controller.status() == Status.loading) {
16+
if (controller.userDataProfileStatus() == Status.loading) {
1717
return Text('Loading ...');
1818
} else {
19-
return Text(controller.userProfileData().name);
19+
return Text(controller.userDataProfile().name);
2020
}
2121
}),
2222
leading: IconButton(
@@ -28,12 +28,12 @@ class DetailScreen extends GetWidget<UserDataProfileControllerV2> {
2828
),
2929
body: Obx(() {
3030
const style = TextStyle(fontSize: 24);
31-
if (controller.status() == Status.loading) {
31+
if (controller.userDataProfileStatus() == Status.loading) {
3232
return Center(child: Text('Loading ...', style: style));
3333
} else {
3434
return Center(
3535
child: Text(
36-
controller.userProfileData().email,
36+
controller.userDataProfile().email,
3737
style: style,
3838
));
3939
}

0 commit comments

Comments
 (0)