diff --git a/packages/go_router/CHANGELOG.md b/packages/go_router/CHANGELOG.md index ebc65a4c0cd..8819d18fb9b 100644 --- a/packages/go_router/CHANGELOG.md +++ b/packages/go_router/CHANGELOG.md @@ -1,3 +1,7 @@ +## 15.3.0 + +- Adds annotation for go_router_builder that enable custom string encoder/decoder [#110781](https://github.com/flutter/flutter/issues/110781). **Requires go_router_builder >= 3.1.0**. + ## 15.2.4 - Fixes routing to treat URLs with different cases (e.g., `/Home` vs `/home`) as distinct routes. diff --git a/packages/go_router/lib/go_router.dart b/packages/go_router/lib/go_router.dart index d2728a077c0..b16c7aa5e01 100644 --- a/packages/go_router/lib/go_router.dart +++ b/packages/go_router/lib/go_router.dart @@ -11,6 +11,7 @@ export 'src/configuration.dart'; export 'src/delegate.dart'; export 'src/information_provider.dart'; export 'src/match.dart' hide RouteMatchListCodec; +export 'src/misc/custom_parameter.dart'; export 'src/misc/errors.dart'; export 'src/misc/extensions.dart'; export 'src/misc/inherited_router.dart'; diff --git a/packages/go_router/lib/src/misc/custom_parameter.dart b/packages/go_router/lib/src/misc/custom_parameter.dart new file mode 100644 index 00000000000..94cd6d14888 --- /dev/null +++ b/packages/go_router/lib/src/misc/custom_parameter.dart @@ -0,0 +1,40 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:meta/meta_meta.dart'; + +/// annotation to define a custom parameter decoder/encoder +/// this is useful when the is encoded/decoded in a non-standard way like base64 +/// this must be used as an annotation on a field +/// ```dart +/// String fromBase64(String value) { +/// return const Utf8Decoder().convert(base64.decode(value)); +/// } +/// String toBase64(String value) { +/// return base64.encode(const Utf8Encoder().convert(value)); +/// } +/// class MyRoute { +/// @CustomParameterCodec( +/// encode: toBase64, +/// decode: fromBase64, +/// ) +/// final String data; +/// MyRoute(this.data); +/// } +/// ``` +@Target({TargetKind.field}) +class CustomParameterCodec { + /// create a custom parameter codec + /// + const CustomParameterCodec({ + required this.encode, + required this.decode, + }); + + /// custom function to encode the field + final String Function(String json) encode; + + /// custom function to decode the field + final String Function(String json) decode; +} diff --git a/packages/go_router/pubspec.yaml b/packages/go_router/pubspec.yaml index 6be302ef6ba..dd279a67302 100644 --- a/packages/go_router/pubspec.yaml +++ b/packages/go_router/pubspec.yaml @@ -1,7 +1,7 @@ name: go_router description: A declarative router for Flutter based on Navigation 2 supporting deep linking, data-driven routes and more -version: 15.2.4 +version: 15.3.0 repository: https://github.com/flutter/packages/tree/main/packages/go_router issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+go_router%22 diff --git a/packages/go_router/test/route_data_test.dart b/packages/go_router/test/route_data_test.dart index 218caef690d..a3b7485748d 100644 --- a/packages/go_router/test/route_data_test.dart +++ b/packages/go_router/test/route_data_test.dart @@ -3,6 +3,7 @@ // found in the LICENSE file. import 'dart:async'; +import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; @@ -226,6 +227,14 @@ final List _routes = [ _goRouteDataRedirect, ]; +String fromBase64(String value) { + return const Utf8Decoder().convert(base64.decode(value)); +} + +String toBase64(String value) { + return base64.encode(const Utf8Encoder().convert(value)); +} + void main() { group('GoRouteData', () { testWidgets( @@ -633,4 +642,14 @@ void main() { ), ); }); + + test('CustomParameterCodec with required parameters', () { + const CustomParameterCodec customParameterCodec = CustomParameterCodec( + encode: toBase64, + decode: fromBase64, + ); + + expect(customParameterCodec.encode, toBase64); + expect(customParameterCodec.decode, fromBase64); + }); }