diff --git a/example/counter/lib/counter/bloc/counter_event.dart b/example/counter/lib/counter/bloc/counter_event.dart index 1ce549a..1f37ec9 100644 --- a/example/counter/lib/counter/bloc/counter_event.dart +++ b/example/counter/lib/counter/bloc/counter_event.dart @@ -1,13 +1,13 @@ part of 'counter_bloc.dart'; -abstract class CounterEvent extends Equatable implements Mappable { +abstract class CounterEvent extends Equatable { const CounterEvent(); @override List get props => []; @override - Map toMap() => {}; + Map toJson() => {}; } class IncrementCounterEvent extends CounterEvent {} diff --git a/example/counter/lib/counter/bloc/counter_state.dart b/example/counter/lib/counter/bloc/counter_state.dart index af360c9..38d665d 100644 --- a/example/counter/lib/counter/bloc/counter_state.dart +++ b/example/counter/lib/counter/bloc/counter_state.dart @@ -1,6 +1,6 @@ part of 'counter_bloc.dart'; -class CounterState extends Equatable implements Mappable { +class CounterState extends Equatable { final int counter; const CounterState({ @@ -20,7 +20,7 @@ class CounterState extends Equatable implements Mappable { ]; @override - Map toMap() => { + Map toJson() => { 'counter': counter, }; } diff --git a/example/flutter_todos/lib/blocs/filtered_todos/filtered_todos_event.dart b/example/flutter_todos/lib/blocs/filtered_todos/filtered_todos_event.dart index d780d17..3ff4919 100755 --- a/example/flutter_todos/lib/blocs/filtered_todos/filtered_todos_event.dart +++ b/example/flutter_todos/lib/blocs/filtered_todos/filtered_todos_event.dart @@ -2,11 +2,11 @@ import 'package:equatable/equatable.dart'; import 'package:flutter_todos/models/models.dart'; import 'package:flutter_bloc_devtools/flutter_bloc_devtools.dart'; -abstract class FilteredTodosEvent extends Equatable implements Mappable { +abstract class FilteredTodosEvent extends Equatable { const FilteredTodosEvent(); @override - Map toMap() => {}; + Map toJson() => {}; } class FilterUpdated extends FilteredTodosEvent { @@ -18,7 +18,7 @@ class FilterUpdated extends FilteredTodosEvent { List get props => [filter]; @override - Map toMap() => { + Map toJson() => { 'filter': filter.toString().substring('VisibilityFilter.'.length), }; } @@ -32,7 +32,7 @@ class TodosUpdated extends FilteredTodosEvent { List get props => [todos]; @override - Map toMap() => { + Map toJson() => { 'todos': todos.map((e) => e.toEntity().toJson()).toList(), }; } diff --git a/example/flutter_todos/lib/blocs/filtered_todos/filtered_todos_state.dart b/example/flutter_todos/lib/blocs/filtered_todos/filtered_todos_state.dart index 1458cac..d86d165 100755 --- a/example/flutter_todos/lib/blocs/filtered_todos/filtered_todos_state.dart +++ b/example/flutter_todos/lib/blocs/filtered_todos/filtered_todos_state.dart @@ -2,14 +2,14 @@ import 'package:equatable/equatable.dart'; import 'package:flutter_todos/models/models.dart'; import 'package:flutter_bloc_devtools/flutter_bloc_devtools.dart'; -abstract class FilteredTodosState extends Equatable implements Mappable { +abstract class FilteredTodosState extends Equatable { const FilteredTodosState(); @override List get props => []; @override - Map toMap() => {}; + Map toJson() => {}; } class FilteredTodosLoadInProgress extends FilteredTodosState {} @@ -27,7 +27,7 @@ class FilteredTodosLoadSuccess extends FilteredTodosState { List get props => [filteredTodos, activeFilter]; @override - Map toMap() => { + Map toJson() => { 'filteredTodos': filteredTodos.map((e) => e.toEntity().toJson()).toList(), 'activeFilter': diff --git a/example/flutter_todos/lib/blocs/stats/stats_event.dart b/example/flutter_todos/lib/blocs/stats/stats_event.dart index 7a7f1c0..57b1171 100755 --- a/example/flutter_todos/lib/blocs/stats/stats_event.dart +++ b/example/flutter_todos/lib/blocs/stats/stats_event.dart @@ -2,11 +2,11 @@ import 'package:equatable/equatable.dart'; import 'package:flutter_todos/models/models.dart'; import 'package:flutter_bloc_devtools/flutter_bloc_devtools.dart'; -abstract class StatsEvent extends Equatable implements Mappable { +abstract class StatsEvent extends Equatable { const StatsEvent(); @override - Map toMap() => {}; + Map toJson() => {}; } class StatsUpdated extends StatsEvent { @@ -18,7 +18,7 @@ class StatsUpdated extends StatsEvent { List get props => [todos]; @override - Map toMap() => { + Map toJson() => { 'todos': todos.map((e) => e.toEntity().toJson()).toList(), }; } diff --git a/example/flutter_todos/lib/blocs/stats/stats_state.dart b/example/flutter_todos/lib/blocs/stats/stats_state.dart index 9b5b65a..c57dda7 100755 --- a/example/flutter_todos/lib/blocs/stats/stats_state.dart +++ b/example/flutter_todos/lib/blocs/stats/stats_state.dart @@ -1,14 +1,14 @@ import 'package:equatable/equatable.dart'; import 'package:flutter_bloc_devtools/flutter_bloc_devtools.dart'; -abstract class StatsState extends Equatable implements Mappable { +abstract class StatsState extends Equatable { const StatsState(); @override List get props => []; @override - Map toMap() => {}; + Map toJson() => {}; } class StatsLoadInProgress extends StatsState {} @@ -23,7 +23,7 @@ class StatsLoadSuccess extends StatsState { List get props => [numActive, numCompleted]; @override - Map toMap() => { + Map toJson() => { 'numActive': numActive, 'numCompleted': numCompleted, }; diff --git a/example/flutter_todos/lib/blocs/tab/tab_event.dart b/example/flutter_todos/lib/blocs/tab/tab_event.dart index 52e53b4..8b34bf4 100755 --- a/example/flutter_todos/lib/blocs/tab/tab_event.dart +++ b/example/flutter_todos/lib/blocs/tab/tab_event.dart @@ -2,11 +2,11 @@ import 'package:equatable/equatable.dart'; import 'package:flutter_todos/models/models.dart'; import 'package:flutter_bloc_devtools/flutter_bloc_devtools.dart'; -abstract class TabEvent extends Equatable implements Mappable { +abstract class TabEvent extends Equatable { const TabEvent(); @override - Map toMap() => {}; + Map toJson() => {}; } class TabUpdated extends TabEvent { @@ -18,7 +18,7 @@ class TabUpdated extends TabEvent { List get props => [tab]; @override - Map toMap() => { + Map toJson() => { 'tab': tab.toString(), }; } diff --git a/example/flutter_todos/lib/blocs/todos/todos_event.dart b/example/flutter_todos/lib/blocs/todos/todos_event.dart index 02a8701..49fbca9 100755 --- a/example/flutter_todos/lib/blocs/todos/todos_event.dart +++ b/example/flutter_todos/lib/blocs/todos/todos_event.dart @@ -2,14 +2,14 @@ import 'package:equatable/equatable.dart'; import 'package:flutter_todos/models/models.dart'; import 'package:flutter_bloc_devtools/flutter_bloc_devtools.dart'; -abstract class TodosEvent extends Equatable implements Mappable { +abstract class TodosEvent extends Equatable { const TodosEvent(); @override List get props => []; @override - Map toMap() => {}; + Map toJson() => {}; } class TodosLoaded extends TodosEvent {} @@ -23,7 +23,7 @@ class TodoAdded extends TodosEvent { List get props => [todo]; @override - Map toMap() => { + Map toJson() => { 'todo': todo.toEntity().toJson(), }; } @@ -37,7 +37,7 @@ class TodoUpdated extends TodosEvent { List get props => [todo]; @override - Map toMap() => { + Map toJson() => { 'todo': todo.toEntity().toJson(), }; } @@ -51,7 +51,7 @@ class TodoDeleted extends TodosEvent { List get props => [todo]; @override - Map toMap() => { + Map toJson() => { 'todo': todo.toEntity().toJson(), }; } diff --git a/example/flutter_todos/lib/blocs/todos/todos_state.dart b/example/flutter_todos/lib/blocs/todos/todos_state.dart index bfc32e5..1381d6e 100755 --- a/example/flutter_todos/lib/blocs/todos/todos_state.dart +++ b/example/flutter_todos/lib/blocs/todos/todos_state.dart @@ -2,14 +2,14 @@ import 'package:equatable/equatable.dart'; import 'package:flutter_todos/models/models.dart'; import 'package:flutter_bloc_devtools/flutter_bloc_devtools.dart'; -abstract class TodosState extends Equatable implements Mappable { +abstract class TodosState extends Equatable { const TodosState(); @override List get props => []; @override - Map toMap() => {}; + Map toJson() => {}; } class TodosLoadInProgress extends TodosState {} @@ -23,7 +23,7 @@ class TodosLoadSuccess extends TodosState { List get props => [todos]; @override - Map toMap() => + Map toJson() => {'todos': todos.map((e) => e.toEntity().toJson()).toList()}; } diff --git a/lib/src/remote_devtools_middleware.dart b/lib/src/remote_devtools_middleware.dart index fc976a9..ee8db17 100644 --- a/lib/src/remote_devtools_middleware.dart +++ b/lib/src/remote_devtools_middleware.dart @@ -18,10 +18,6 @@ enum RemoteDevToolsStatus { started } -abstract class Mappable { - Map toMap(); -} - class RemoteDevToolsObserver extends BlocObserver { /// /// The remote-devtools server to connect to. Should include @@ -110,29 +106,22 @@ class RemoteDevToolsObserver extends BlocObserver { final message = {'type': type, 'id': socket.id, 'name': instanceName}; final blocName = _getBlocName(bloc); - if (state != null) { - /// Add or update Bloc state - if (state is Mappable) { - _appState[blocName] = state.toMap(); - message['payload'] = jsonEncode(_appState); - } else { - _appState[blocName] = state.toString(); - message['payload'] = jsonEncode(_appState); - } - } else { + if (state == null) { /// Remove Bloc state if (_appState.containsKey(blocName)) { _removeBlocName(bloc); _appState.remove(blocName); - message['payload'] = jsonEncode(_appState); } + } else { + /// Add or update Bloc state + _appState[blocName] = _maybeToJson(state) ?? state.toString(); } + message['payload'] = jsonEncode(_appState); + message['action'] = _actionEncode(action); + if (type == 'ACTION') { - message['action'] = _actionEncode(action); message['nextActionId'] = nextActionId; - } else if (action != null) { - message['action'] = action as String; } socket.emit(socket.id != null ? 'log' : 'log-noid', message); } @@ -161,27 +150,30 @@ class RemoteDevToolsObserver extends BlocObserver { } } - String _actionEncode(dynamic action) { - if (action is Mappable) { - if (action.toMap().keys.isEmpty) { - return jsonEncode({ - 'type': action.runtimeType.toString(), - }); - } - return jsonEncode({ - 'type': action.runtimeType.toString(), - 'payload': action.toMap(), - }); + Object _maybeToJson(dynamic object) { + try { + return object.toJson(); + } on NoSuchMethodError { + return null; + } + } + + String _actionEncode(Object action) { + if (action == null) { + return null; } + final jsonOrNull = _maybeToJson(action); - if (action.toString().contains('Instance of')) { - return jsonEncode({ - 'type': action.runtimeType.toString(), - }); + var actionName = action.toString(); + if (actionName.contains('Instance of')) { + actionName = action.runtimeType.toString(); } return jsonEncode({ - 'type': action.toString(), + 'type': actionName, + if (jsonOrNull != null && + (jsonOrNull is Map ? jsonOrNull.isNotEmpty : true)) + 'payload': jsonOrNull, }); } } diff --git a/pubspec.yaml b/pubspec.yaml index e235009..8cf6262 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ homepage: https://github.com/andrea689/flutter_bloc_devtools/ version: 0.1.0 environment: - sdk: '>=2.0.0 <3.0.0' + sdk: '>=2.3.0 <3.0.0' dependencies: bloc: ^6.1.0