From d53da1cdf3933e74e4db194980a7aa5d22d355d6 Mon Sep 17 00:00:00 2001 From: Victor Bayona Date: Wed, 15 Jul 2026 14:58:35 +0900 Subject: [PATCH 1/2] Add survey response tracking support --- android/build.gradle | 2 +- .../flutter/nubrick_flutter/Manager.kt | 40 ++++++++++++++----- .../nubrick_flutter/NubrickFlutterPlugin.kt | 9 +++-- .../xcshareddata/swiftpm/Package.resolved | 4 +- .../xcshareddata/swiftpm/Package.resolved | 4 +- .../xcshareddata/swiftpm/Package.resolved | 4 +- .../xcshareddata/swiftpm/Package.resolved | 4 +- example/lib/main.dart | 2 +- ios/nubrick_flutter.podspec | 2 +- ios/nubrick_flutter/Package.resolved | 4 +- ios/nubrick_flutter/Package.swift | 2 +- .../Sources/nubrick_flutter/Manager.swift | 12 +++++- .../NubrickFlutterPlugin.swift | 13 +++++- .../nubrick_flutter_method_channel.dart | 6 ++- .../nubrick_flutter_platform_interface.dart | 4 +- lib/schema/generated.dart | 4 ++ lib/src/runtime.dart | 28 ++++++++++--- lib/tooltip/overlay.dart | 11 +++-- test/nubrick_test.dart | 10 ++++- 19 files changed, 122 insertions(+), 43 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index a2b189f..53eee0a 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -58,7 +58,7 @@ android { } dependencies { - implementation 'app.nubrick:nubrick:0.13.5' + implementation 'app.nubrick:nubrick:0.15.1' implementation 'androidx.activity:activity-compose:1.8.2' testImplementation 'org.jetbrains.kotlin:kotlin-test' testImplementation 'org.mockito:mockito-core:5.0.0' diff --git a/android/src/main/kotlin/app/nubrick/flutter/nubrick_flutter/Manager.kt b/android/src/main/kotlin/app/nubrick/flutter/nubrick_flutter/Manager.kt index ed2ccfb..e610353 100644 --- a/android/src/main/kotlin/app/nubrick/flutter/nubrick_flutter/Manager.kt +++ b/android/src/main/kotlin/app/nubrick/flutter/nubrick_flutter/Manager.kt @@ -9,6 +9,7 @@ import app.nubrick.nubrick.FlutterBridgeApi import app.nubrick.nubrick.FlutterBridge import app.nubrick.nubrick.NubrickSDK import app.nubrick.nubrick.data.ExceptionRecord +import app.nubrick.nubrick.data.ExperimentContent import app.nubrick.nubrick.data.NotFoundException import app.nubrick.nubrick.data.StackFrame import app.nubrick.nubrick.data.CrashSeverity @@ -54,7 +55,7 @@ internal class NubrickFlutterManager( private val binaryMessenger: BinaryMessenger, private val scope: CoroutineScope ) { - private var embeddingMap: MutableMap = mutableMapOf() + private var embeddingMap: MutableMap = mutableMapOf() private var embeddingArgumentStateMap: MutableMap> = mutableMapOf() private var eventBridgeViewMap: MutableMap = mutableMapOf() private var configMap: MutableMap = mutableMapOf() @@ -64,7 +65,7 @@ internal class NubrickFlutterManager( projectId: String, onEvent: (event: Event) -> Unit, onDispatch: (event: NubrickEvent) -> Unit, - onTooltip: (data: String, experimentId: String) -> Unit + onTooltip: (data: String, experimentId: String, variantId: String?) -> Unit ) { // Callbacks are passed at init to avoid missing events fired during initialization. NubrickSDK.initialize( @@ -97,11 +98,16 @@ internal class NubrickFlutterManager( } // embedding - fun connectEmbedding(channelId: String, experimentId: String, componentId: String? = null) { + fun connectEmbedding( + channelId: String, + experimentId: String, + componentId: String? = null, + variantId: String? = null, + ) { val methodChannel = MethodChannel(this.binaryMessenger, "Nubrick/Embedding/$channelId") scope.launch { val result = withContext(Dispatchers.IO) { - FlutterBridge.connectEmbedding(experimentId, componentId) + FlutterBridge.connectEmbedding(experimentId, componentId, variantId) } result.onSuccess { embeddingMap[channelId] = it @@ -153,7 +159,7 @@ internal class NubrickFlutterManager( val methodChannel = remember(channelId) { MethodChannel(this.binaryMessenger, "Nubrick/Embedding/$channelId") } - val data = this.embeddingMap[channelId] + val data = this.embeddingMap[channelId] ?: return val eventBridge = this.eventBridgeViewMap[channelId] FlutterBridge.render( modifier, @@ -239,13 +245,29 @@ internal class NubrickFlutterManager( val variant = config.variant ?: return val componentId = variant.get(key) ?: return val experimentId = config.experimentId ?: return - this.connectEmbedding(embeddingChannelId, experimentId, componentId) + this.connectEmbedding( + channelId = embeddingChannelId, + experimentId = experimentId, + componentId = componentId, + variantId = variant.id, + ) } - fun connectTooltipEmbedding(channelId: String, rootBlock: String) { - if (channelId.isEmpty()) return - embeddingMap[channelId] = rootBlock + fun connectTooltipEmbedding( + channelId: String, + experimentId: String, + variantId: String?, + rootJson: String, + ): Result { + if (channelId.isEmpty() || experimentId.isEmpty()) { + return Result.failure(IllegalArgumentException("Missing tooltip channel or experiment ID")) + } + val content = FlutterBridge.buildExperimentContent(experimentId, variantId, rootJson).getOrElse { + return Result.failure(it) + } + embeddingMap[channelId] = content eventBridgeViewMap[channelId] = UIBlockActionBridge() + return Result.success(Unit) } suspend fun callTooltipEmbeddingDispatch(channelId: String, event: String) { diff --git a/android/src/main/kotlin/app/nubrick/flutter/nubrick_flutter/NubrickFlutterPlugin.kt b/android/src/main/kotlin/app/nubrick/flutter/nubrick_flutter/NubrickFlutterPlugin.kt index 1b6ae29..c8cee79 100644 --- a/android/src/main/kotlin/app/nubrick/flutter/nubrick_flutter/NubrickFlutterPlugin.kt +++ b/android/src/main/kotlin/app/nubrick/flutter/nubrick_flutter/NubrickFlutterPlugin.kt @@ -98,11 +98,12 @@ class NubrickFlutterPlugin: FlutterPlugin, MethodCallHandler { )) } }, - onTooltip = { data, experimentId -> + onTooltip = { data, experimentId, variantId -> sdkScope.launch { channel.invokeMethod("on-tooltip", mapOf( "data" to data, "experimentId" to experimentId, + "variantId" to variantId, )) } } @@ -176,8 +177,10 @@ class NubrickFlutterPlugin: FlutterPlugin, MethodCallHandler { // tooltip "connectTooltipEmbedding" -> { val channelId = call.argument("channelId") as String - val rootBlock = call.argument("json") as String - this.manager.connectTooltipEmbedding(channelId, rootBlock) + val experimentId = call.argument("experimentId") as String + val variantId = call.argument("variantId") + val rootJson = call.argument("json") as String + this.manager.connectTooltipEmbedding(channelId, experimentId, variantId, rootJson) result.success("ok") } "callTooltipEmbeddingDispatch" -> { diff --git a/e2e/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/e2e/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index b63f0e0..5000103 100644 --- a/e2e/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/e2e/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -5,8 +5,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/plaidev/nubrick-ios.git", "state" : { - "revision" : "766c90de1739febeccadfca47af1d1a0e47cb40c", - "version" : "0.18.5" + "revision" : "fd48c942076311551ca889331c4d2bc2332562d9", + "version" : "0.19.2" } } ], diff --git a/e2e/ios/Runner.xcworkspace/xcshareddata/swiftpm/Package.resolved b/e2e/ios/Runner.xcworkspace/xcshareddata/swiftpm/Package.resolved index b63f0e0..5000103 100644 --- a/e2e/ios/Runner.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/e2e/ios/Runner.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -5,8 +5,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/plaidev/nubrick-ios.git", "state" : { - "revision" : "766c90de1739febeccadfca47af1d1a0e47cb40c", - "version" : "0.18.5" + "revision" : "fd48c942076311551ca889331c4d2bc2332562d9", + "version" : "0.19.2" } } ], diff --git a/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index b63f0e0..5000103 100644 --- a/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -5,8 +5,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/plaidev/nubrick-ios.git", "state" : { - "revision" : "766c90de1739febeccadfca47af1d1a0e47cb40c", - "version" : "0.18.5" + "revision" : "fd48c942076311551ca889331c4d2bc2332562d9", + "version" : "0.19.2" } } ], diff --git a/example/ios/Runner.xcworkspace/xcshareddata/swiftpm/Package.resolved b/example/ios/Runner.xcworkspace/xcshareddata/swiftpm/Package.resolved index b63f0e0..5000103 100644 --- a/example/ios/Runner.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/example/ios/Runner.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -5,8 +5,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/plaidev/nubrick-ios.git", "state" : { - "revision" : "766c90de1739febeccadfca47af1d1a0e47cb40c", - "version" : "0.18.5" + "revision" : "fd48c942076311551ca889331c4d2bc2332562d9", + "version" : "0.19.2" } } ], diff --git a/example/lib/main.dart b/example/lib/main.dart index 71a5979..3add0d7 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -3,7 +3,7 @@ import 'package:nubrick_flutter/nubrick_flutter.dart'; void main() { WidgetsFlutterBinding.ensureInitialized(); - Nubrick.initialize("p_d357ola9io6g00f6evag"); + Nubrick.initialize("cgv3p3223akg00fod19g"); // Global event listener Nubrick.addEventListener((event) { print("Global Event: ${event.name}"); diff --git a/ios/nubrick_flutter.podspec b/ios/nubrick_flutter.podspec index 6ac4ecc..dc81f42 100644 --- a/ios/nubrick_flutter.podspec +++ b/ios/nubrick_flutter.podspec @@ -15,7 +15,7 @@ A new Flutter plugin project. s.source = { :path => '.' } s.source_files = 'nubrick_flutter/Sources/nubrick_flutter/**/*.swift' s.dependency 'Flutter' - s.dependency 'Nubrick', '0.18.5' + s.dependency 'Nubrick', '0.19.2' s.ios.deployment_target = '15.0' s.platform = :ios, '15.0' diff --git a/ios/nubrick_flutter/Package.resolved b/ios/nubrick_flutter/Package.resolved index b63f0e0..5000103 100644 --- a/ios/nubrick_flutter/Package.resolved +++ b/ios/nubrick_flutter/Package.resolved @@ -5,8 +5,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/plaidev/nubrick-ios.git", "state" : { - "revision" : "766c90de1739febeccadfca47af1d1a0e47cb40c", - "version" : "0.18.5" + "revision" : "fd48c942076311551ca889331c4d2bc2332562d9", + "version" : "0.19.2" } } ], diff --git a/ios/nubrick_flutter/Package.swift b/ios/nubrick_flutter/Package.swift index 75efa75..e649f82 100644 --- a/ios/nubrick_flutter/Package.swift +++ b/ios/nubrick_flutter/Package.swift @@ -12,7 +12,7 @@ let package = Package( dependencies: [ .package( url: "https://github.com/plaidev/nubrick-ios.git", - exact: "0.18.5" + exact: "0.19.2" ) ], targets: [ diff --git a/ios/nubrick_flutter/Sources/nubrick_flutter/Manager.swift b/ios/nubrick_flutter/Sources/nubrick_flutter/Manager.swift index 34bff26..8c26764 100644 --- a/ios/nubrick_flutter/Sources/nubrick_flutter/Manager.swift +++ b/ios/nubrick_flutter/Sources/nubrick_flutter/Manager.swift @@ -86,7 +86,7 @@ class NubrickFlutterManager { projectId: String, onEvent: (@Sendable (_ event: ComponentEvent) -> Void)? = nil, onDispatch: ((_ event: NubrickEvent) -> Void)? = nil, - onTooltip: ((_ data: String, _ experimentId: String) -> Void)? = nil + onTooltip: ((_ data: String, _ experimentId: String, _ variantId: String?) -> Void)? = nil ) { // Callbacks are passed at init to avoid missing events fired during initialization. NubrickBridge.initialize( @@ -284,10 +284,18 @@ class NubrickFlutterManager { } // tooltip - func connectTooltipEmbedding(channelId: String, rootBlock: String, messenger: FlutterBinaryMessenger) { + func connectTooltipEmbedding( + channelId: String, + experimentId: String, + variantId: String?, + rootBlock: String, + messenger: FlutterBinaryMessenger + ) { let channel = FlutterMethodChannel(name: "Nubrick/Embedding/\(channelId)", binaryMessenger: messenger) let accessor = NubrickBridge.renderUIView( json: rootBlock, + experimentId: experimentId, + variantId: variantId, onEvent: { event in channel.invokeMethod(ON_EVENT_METHOD, arguments: [ "name": event.name as Any?, diff --git a/ios/nubrick_flutter/Sources/nubrick_flutter/NubrickFlutterPlugin.swift b/ios/nubrick_flutter/Sources/nubrick_flutter/NubrickFlutterPlugin.swift index bd35a26..679527e 100644 --- a/ios/nubrick_flutter/Sources/nubrick_flutter/NubrickFlutterPlugin.swift +++ b/ios/nubrick_flutter/Sources/nubrick_flutter/NubrickFlutterPlugin.swift @@ -75,11 +75,12 @@ public class NubrickFlutterPlugin: NSObject, FlutterPlugin { ]) } }, - onTooltip: { [weak self] data, experimentId in + onTooltip: { [weak self] data, experimentId, variantId in Task { @MainActor in self?.channel.invokeMethod("on-tooltip", arguments: [ "data": data, "experimentId": experimentId, + "variantId": variantId, ]) } } @@ -157,8 +158,16 @@ public class NubrickFlutterPlugin: NSObject, FlutterPlugin { case "connectTooltipEmbedding": let args = call.arguments as! [String:Any] let channelId = args["channelId"] as! String + let experimentId = args["experimentId"] as! String + let variantId = args["variantId"] as? String let rootBlock = args["json"] as! String - self.manager.connectTooltipEmbedding(channelId: channelId, rootBlock: rootBlock, messenger: self.messenger) + self.manager.connectTooltipEmbedding( + channelId: channelId, + experimentId: experimentId, + variantId: variantId, + rootBlock: rootBlock, + messenger: self.messenger + ) result("ok") case "callTooltipEmbeddingDispatch": diff --git a/lib/channel/nubrick_flutter_method_channel.dart b/lib/channel/nubrick_flutter_method_channel.dart index f197270..0ecff82 100644 --- a/lib/channel/nubrick_flutter_method_channel.dart +++ b/lib/channel/nubrick_flutter_method_channel.dart @@ -136,13 +136,15 @@ class MethodChannelNubrickFlutter extends NubrickFlutterPlatform { } @override - Future connectTooltipEmbedding( - String channelId, UIRootBlock rootBlock) async { + Future connectTooltipEmbedding(String channelId, String experimentId, + String? variantId, UIRootBlock rootBlock) async { var json = jsonEncode(rootBlock.encode()); final result = await methodChannel.invokeMethod( 'connectTooltipEmbedding', { 'channelId': channelId, + 'experimentId': experimentId, + 'variantId': variantId, 'json': json, }, ); diff --git a/lib/channel/nubrick_flutter_platform_interface.dart b/lib/channel/nubrick_flutter_platform_interface.dart index 0c2dacb..f712a96 100644 --- a/lib/channel/nubrick_flutter_platform_interface.dart +++ b/lib/channel/nubrick_flutter_platform_interface.dart @@ -76,8 +76,8 @@ abstract class NubrickFlutterPlatform extends PlatformInterface { 'connectEmbeddingInRemoteConfigValue() has not been implemented.'); } - Future connectTooltipEmbedding( - String channelId, UIRootBlock rootBlock) { + Future connectTooltipEmbedding(String channelId, String experimentId, + String? variantId, UIRootBlock rootBlock) { throw UnimplementedError( 'connectTooltipEmbedding() has not been implemented.'); } diff --git a/lib/schema/generated.dart b/lib/schema/generated.dart index b015aa4..829f5b8 100644 --- a/lib/schema/generated.dart +++ b/lib/schema/generated.dart @@ -2248,6 +2248,7 @@ class UIBlockAction { final List? requiredFields; final ApiHttpRequest? httpRequest; final ApiHttpResponseAssertion? httpResponseAssertion; + final bool? submitSurveyResponse; UIBlockAction({ this.eventName, @@ -2258,6 +2259,7 @@ class UIBlockAction { this.requiredFields, this.httpRequest, this.httpResponseAssertion, + this.submitSurveyResponse, }); static UIBlockAction? decode(dynamic json) { @@ -2280,6 +2282,7 @@ class UIBlockAction { httpRequest: ApiHttpRequest.decode(json['httpRequest']), httpResponseAssertion: ApiHttpResponseAssertion.decode(json['httpResponseAssertion']), + submitSurveyResponse: BooleanDecoder.decode(json['submitSurveyResponse']), ); } @@ -2294,6 +2297,7 @@ class UIBlockAction { 'requiredFields': requiredFields?.map((e) => e).toList(growable: false), 'httpRequest': httpRequest?.encode(), 'httpResponseAssertion': httpResponseAssertion?.encode(), + 'submitSurveyResponse': submitSurveyResponse, }; } } diff --git a/lib/src/runtime.dart b/lib/src/runtime.dart index a59aa36..8632d59 100644 --- a/lib/src/runtime.dart +++ b/lib/src/runtime.dart @@ -22,7 +22,9 @@ class NubrickRuntime { Completer? _initializationCompleter; final List _listeners = []; final List _onDispatchListeners = []; - final List _onTooltipListeners = []; + final List _publicTooltipListeners = []; + final List + _internalTooltipListeners = []; final MethodChannel _channel = const MethodChannel("nubrick_flutter"); NubrickRuntime._internal(); @@ -183,11 +185,21 @@ class NubrickRuntime { } void addOnTooltipListener(void Function(String, String?) listener) { - _onTooltipListeners.add(listener); + _publicTooltipListeners.add(listener); } void removeOnTooltipListener(void Function(String, String?) listener) { - _onTooltipListeners.remove(listener); + _publicTooltipListeners.remove(listener); + } + + void addInternalTooltipListener( + void Function(String, String?, String?) listener) { + _internalTooltipListeners.add(listener); + } + + void removeInternalTooltipListener( + void Function(String, String?, String?) listener) { + _internalTooltipListeners.remove(listener); } Future _handleMethod(MethodCall call) async { @@ -212,17 +224,22 @@ class NubrickRuntime { case 'on-tooltip': String? data; String? experimentId; + String? variantId; final args = call.arguments; if (args is String) { data = args; } else if (args is Map) { data = args["data"] as String?; experimentId = args["experimentId"] as String?; + variantId = args["variantId"] as String?; } if (data != null) { - for (var listener in List.of(_onTooltipListeners)) { + for (var listener in List.of(_publicTooltipListeners)) { listener(data, experimentId); } + for (var listener in List.of(_internalTooltipListeners)) { + listener(data, experimentId, variantId); + } } return Future.value(true); default: @@ -255,6 +272,7 @@ class NubrickRuntime { _listeners.clear(); _onDispatchListeners.clear(); - _onTooltipListeners.clear(); + _publicTooltipListeners.clear(); + _internalTooltipListeners.clear(); } } diff --git a/lib/tooltip/overlay.dart b/lib/tooltip/overlay.dart index 6bcebcb..855d126 100644 --- a/lib/tooltip/overlay.dart +++ b/lib/tooltip/overlay.dart @@ -155,13 +155,16 @@ class NubrickTooltipOverlayState extends State { return _currentTooltipTransitionId; } - void _onTooltip(String data, String? experimentId) async { + void _onTooltip(String data, String? experimentId, String? variantId) async { // Ignore re-entrant tooltip events during an active flow. // A new flow starts only after native sends dismiss/next and _hideTooltip // resets this flag. if (_isTooltipFlowActive) { return; } + if (experimentId == null || experimentId.isEmpty) { + return; + } final decodedData = jsonDecode(data); var uiroot = schema.UIRootBlock.decode(decodedData); @@ -208,6 +211,8 @@ class NubrickTooltipOverlayState extends State { } await NubrickFlutterPlatform.instance.connectTooltipEmbedding( _channelId, + experimentId, + variantId, schema.UIRootBlock( id: generateRandomString(16), data: schema.UIRootBlockData( @@ -580,13 +585,13 @@ class NubrickTooltipOverlayState extends State { super.initState(); _channel = MethodChannel("Nubrick/Embedding/$_channelId"); _channel.setMethodCallHandler(_handleMethod); - nubrickRuntime.addOnTooltipListener(_onTooltip); + nubrickRuntime.addInternalTooltipListener(_onTooltip); } @override void dispose() { _channel.setMethodCallHandler(null); - nubrickRuntime.removeOnTooltipListener(_onTooltip); + nubrickRuntime.removeInternalTooltipListener(_onTooltip); if (_channelId.isNotEmpty) { NubrickFlutterPlatform.instance.disconnectTooltipEmbedding(_channelId); } diff --git a/test/nubrick_test.dart b/test/nubrick_test.dart index 6592948..f69a730 100644 --- a/test/nubrick_test.dart +++ b/test/nubrick_test.dart @@ -251,7 +251,8 @@ void main() { expect(Nubrick.projectId, 'project-b'); }); - test('rolls back initialization when native setup rejects the project', () async { + test('rolls back initialization when native setup rejects the project', + () async { fakePlatform.connectClientResult = 'no'; Nubrick.initialize('project-a'); @@ -375,18 +376,25 @@ void main() { String? tooltipData; String? tooltipExperimentId; + String? tooltipVariantId; Nubrick.addOnTooltipListener((data, experimentId) { tooltipData = data; tooltipExperimentId = experimentId; }); + nubrickRuntime + .addInternalTooltipListener((data, experimentId, variantId) { + tooltipVariantId = variantId; + }); await _sendMethodChannelCall('on-tooltip', { 'data': '{"step":1}', 'experimentId': 'exp-123', + 'variantId': 'var-456', }); expect(tooltipData, '{"step":1}'); expect(tooltipExperimentId, 'exp-123'); + expect(tooltipVariantId, 'var-456'); }); }); } From 03db68d372684f3a931f6359cde41fe1ca05b228 Mon Sep 17 00:00:00 2001 From: Victor Bayona Date: Wed, 15 Jul 2026 15:05:37 +0900 Subject: [PATCH 2/2] Bump to 0.20.0 --- CHANGELOG.md | 4 ++++ e2e/pubspec.lock | 2 +- example/pubspec.lock | 2 +- lib/version.dart | 2 +- pubspec.yaml | 2 +- 5 files changed, 8 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 22ff574..51b11f0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.20.0 + +- Add survey response tracking support + ## 0.19.3 - Fix issue on Android diff --git a/e2e/pubspec.lock b/e2e/pubspec.lock index 442260e..445e79e 100644 --- a/e2e/pubspec.lock +++ b/e2e/pubspec.lock @@ -137,7 +137,7 @@ packages: path: ".." relative: true source: path - version: "0.19.3" + version: "0.20.0" path: dependency: transitive description: diff --git a/example/pubspec.lock b/example/pubspec.lock index 8614eb0..835a97c 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -160,7 +160,7 @@ packages: path: ".." relative: true source: path - version: "0.19.3" + version: "0.20.0" path: dependency: transitive description: diff --git a/lib/version.dart b/lib/version.dart index 7545a00..fd80911 100644 --- a/lib/version.dart +++ b/lib/version.dart @@ -1,2 +1,2 @@ /// The version of the Nubrick Flutter SDK. -const String nubrickFlutterSdkVersion = '0.19.3'; +const String nubrickFlutterSdkVersion = '0.20.0'; diff --git a/pubspec.yaml b/pubspec.yaml index 8d603d0..2d25fbf 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: nubrick_flutter description: "Nubrick bridge sdk for flutter" -version: 0.19.3 +version: 0.20.0 homepage: "https://nubrick.app" repository: "https://github.com/plaidev/nubrick-flutter"