>>> class JsonCodec { const JsonCodec({ Object? reviver(Object? key, Object? value)?, Object? toEncodable(dynamic object)?}) : _reviver = reviver, _toEncodable = toEncodable; } <<< class JsonCodec { const JsonCodec({ Object? reviver(Object? key, Object? value)?, Object? toEncodable(dynamic object)?, }) : _reviver = reviver, _toEncodable = toEncodable; } >>> class JsonUtf8Encoder { JsonUtf8Encoder( [String? indent, dynamic toEncodable(dynamic object)?, int? bufferSize]) : _indent = _utf8Encode(indent), _toEncodable = toEncodable, _bufferSize = bufferSize ?? _defaultBufferSize; } <<< class JsonUtf8Encoder { JsonUtf8Encoder([ String? indent, dynamic toEncodable(dynamic object)?, int? bufferSize, ]) : _indent = _utf8Encode(indent), _toEncodable = toEncodable, _bufferSize = bufferSize ?? _defaultBufferSize; } >>> comma between parameters mandatory(f()?,i) {} optional([f()?,i]) {} named({f()?,i}) {} <<< mandatory(f()?, i) {} optional([f()?, i]) {} named({f()?, i}) {} >>> trailing commas mandatory(f()?,) {} optional([f()?,]) {} named({f()?,}) {} <<< mandatory(f()?) {} optional([f()?]) {} named({f()?}) {} >>> constructor initializer trailing comma class C { C(f()?,) : field = 3; } <<< class C { C(f()?) : field = 3; }