diff --git a/packages/stream_chat/lib/src/models/filter.dart b/packages/stream_chat/lib/src/models/filter.dart
index 2356c57b..82ca1177 100644
--- a/packages/stream_chat/lib/src/models/filter.dart
+++ b/packages/stream_chat/lib/src/models/filter.dart
@@ -87,8 +87,8 @@ extension FilterOperatorX on FilterOperator {
/// See Query Channels Documentation
class Filter extends Equatable {
const Filter.__({
- required this.operator,
required this.value,
+ this.operator,
this.key,
});
@@ -159,13 +159,13 @@ class Filter extends Equatable {
/// Creates a custom [Filter] if there isn't one already available.
const factory Filter.custom({
- required String operator,
required Object value,
+ String? operator,
String? key,
}) = Filter.__;
/// An operator used for the filter. The operator string must start with `$`
- final String operator;
+ final String? operator;
/// The "left-hand" side of the filter.
/// Specifies the name of the field the filter should match.
@@ -188,7 +188,7 @@ class Filter extends Equatable {
final groupOperators = _groupOperators.map((it) => it.rawValue);
assert(
- groupOperators.contains(operator) || key != null,
+ (operator != null && groupOperators.contains(operator)) || key != null,
'Filter must contain the `key` when the operator is not a '
'group operator.',
);
@@ -196,11 +196,13 @@ class Filter extends Equatable {
if (groupOperators.contains(operator)) {
// Filters with group operators are encoded in the following form:
// { $: [ , ] }
- json[operator] = value;
- } else {
+ json[operator!] = value;
+ } else if (operator != null) {
// Normal filters are encoded in the following form:
// { key: { $: } }
json[key!] = {operator: value};
+ } else {
+ json[key!] = value;
}
return json;