diff --git a/packages/path_provider/path_provider_ios/CHANGELOG.md b/packages/path_provider/path_provider_ios/CHANGELOG.md index 1940f5c7888e..8569c1b35027 100644 --- a/packages/path_provider/path_provider_ios/CHANGELOG.md +++ b/packages/path_provider/path_provider_ios/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.10 + +* Switches backend to pigeon. + ## 2.0.9 * Fixes library_private_types_in_public_api, sort_child_properties_last and use_key_in_widget_constructors diff --git a/packages/path_provider/path_provider_ios/example/ios/Runner.xcodeproj/project.pbxproj b/packages/path_provider/path_provider_ios/example/ios/Runner.xcodeproj/project.pbxproj index fec246b9e08c..601985b46ae6 100644 --- a/packages/path_provider/path_provider_ios/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/path_provider/path_provider_ios/example/ios/Runner.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 50; + objectVersion = 46; objects = { /* Begin PBXBuildFile section */ @@ -512,6 +512,7 @@ "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", @@ -533,6 +534,7 @@ "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", diff --git a/packages/path_provider/path_provider_ios/ios/Classes/FLTPathProviderPlugin.m b/packages/path_provider/path_provider_ios/ios/Classes/FLTPathProviderPlugin.m index ac6a1be9414f..82b8df5382fb 100644 --- a/packages/path_provider/path_provider_ios/ios/Classes/FLTPathProviderPlugin.m +++ b/packages/path_provider/path_provider_ios/ios/Classes/FLTPathProviderPlugin.m @@ -3,47 +3,41 @@ // found in the LICENSE file. #import "FLTPathProviderPlugin.h" +#import "messages.g.h" -NSString *GetDirectoryOfType(NSSearchPathDirectory dir) { +static NSString *GetDirectoryOfType(NSSearchPathDirectory dir) { NSArray *paths = NSSearchPathForDirectoriesInDomains(dir, NSUserDomainMask, YES); return paths.firstObject; } +@interface FLTPathProviderPlugin () +@end + @implementation FLTPathProviderPlugin + (void)registerWithRegistrar:(NSObject *)registrar { - FlutterMethodChannel *channel = - [FlutterMethodChannel methodChannelWithName:@"plugins.flutter.io/path_provider_ios" - binaryMessenger:registrar.messenger]; - [channel setMethodCallHandler:^(FlutterMethodCall *call, FlutterResult result) { - if ([@"getTemporaryDirectory" isEqualToString:call.method]) { - result([self getTemporaryDirectory]); - } else if ([@"getApplicationDocumentsDirectory" isEqualToString:call.method]) { - result([self getApplicationDocumentsDirectory]); - } else if ([@"getApplicationSupportDirectory" isEqualToString:call.method]) { - result([self getApplicationSupportDirectory]); - } else if ([@"getLibraryDirectory" isEqualToString:call.method]) { - result([self getLibraryDirectory]); - } else { - result(FlutterMethodNotImplemented); - } - }]; -} - -+ (NSString *)getTemporaryDirectory { - return GetDirectoryOfType(NSCachesDirectory); + FLTPathProviderPlugin *plugin = [[FLTPathProviderPlugin alloc] init]; + FLTPathProviderApiSetup(registrar.messenger, plugin); } -+ (NSString *)getApplicationDocumentsDirectory { +- (nullable NSString *)getApplicationDocumentsPathWithError: + (FlutterError *_Nullable __autoreleasing *_Nonnull)error { return GetDirectoryOfType(NSDocumentDirectory); } -+ (NSString *)getApplicationSupportDirectory { +- (nullable NSString *)getApplicationSupportPathWithError: + (FlutterError *_Nullable __autoreleasing *_Nonnull)error { return GetDirectoryOfType(NSApplicationSupportDirectory); } -+ (NSString *)getLibraryDirectory { +- (nullable NSString *)getLibraryPathWithError: + (FlutterError *_Nullable __autoreleasing *_Nonnull)error { return GetDirectoryOfType(NSLibraryDirectory); } +- (nullable NSString *)getTemporaryPathWithError: + (FlutterError *_Nullable __autoreleasing *_Nonnull)error { + return GetDirectoryOfType(NSCachesDirectory); +} + @end diff --git a/packages/path_provider/path_provider_ios/ios/Classes/messages.g.h b/packages/path_provider/path_provider_ios/ios/Classes/messages.g.h new file mode 100644 index 000000000000..b6c1d4d92dd4 --- /dev/null +++ b/packages/path_provider/path_provider_ios/ios/Classes/messages.g.h @@ -0,0 +1,28 @@ +// 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. +// Autogenerated from Pigeon (v3.1.5), do not edit directly. +// See also: https://pub.dev/packages/pigeon +#import +@protocol FlutterBinaryMessenger; +@protocol FlutterMessageCodec; +@class FlutterError; +@class FlutterStandardTypedData; + +NS_ASSUME_NONNULL_BEGIN + +/// The codec used by FLTPathProviderApi. +NSObject *FLTPathProviderApiGetCodec(void); + +@protocol FLTPathProviderApi +- (nullable NSString *)getTemporaryPathWithError:(FlutterError *_Nullable *_Nonnull)error; +- (nullable NSString *)getApplicationSupportPathWithError:(FlutterError *_Nullable *_Nonnull)error; +- (nullable NSString *)getLibraryPathWithError:(FlutterError *_Nullable *_Nonnull)error; +- (nullable NSString *)getApplicationDocumentsPathWithError: + (FlutterError *_Nullable *_Nonnull)error; +@end + +extern void FLTPathProviderApiSetup(id binaryMessenger, + NSObject *_Nullable api); + +NS_ASSUME_NONNULL_END diff --git a/packages/path_provider/path_provider_ios/ios/Classes/messages.g.m b/packages/path_provider/path_provider_ios/ios/Classes/messages.g.m new file mode 100644 index 000000000000..2589df1837e7 --- /dev/null +++ b/packages/path_provider/path_provider_ios/ios/Classes/messages.g.m @@ -0,0 +1,138 @@ +// 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. +// Autogenerated from Pigeon (v3.1.5), do not edit directly. +// See also: https://pub.dev/packages/pigeon +#import "messages.g.h" +#import + +#if !__has_feature(objc_arc) +#error File requires ARC to be enabled. +#endif + +static NSDictionary *wrapResult(id result, FlutterError *error) { + NSDictionary *errorDict = (NSDictionary *)[NSNull null]; + if (error) { + errorDict = @{ + @"code" : (error.code ?: [NSNull null]), + @"message" : (error.message ?: [NSNull null]), + @"details" : (error.details ?: [NSNull null]), + }; + } + return @{ + @"result" : (result ?: [NSNull null]), + @"error" : errorDict, + }; +} + +@interface FLTPathProviderApiCodecReader : FlutterStandardReader +@end +@implementation FLTPathProviderApiCodecReader +@end + +@interface FLTPathProviderApiCodecWriter : FlutterStandardWriter +@end +@implementation FLTPathProviderApiCodecWriter +@end + +@interface FLTPathProviderApiCodecReaderWriter : FlutterStandardReaderWriter +@end +@implementation FLTPathProviderApiCodecReaderWriter +- (FlutterStandardWriter *)writerWithData:(NSMutableData *)data { + return [[FLTPathProviderApiCodecWriter alloc] initWithData:data]; +} +- (FlutterStandardReader *)readerWithData:(NSData *)data { + return [[FLTPathProviderApiCodecReader alloc] initWithData:data]; +} +@end + +NSObject *FLTPathProviderApiGetCodec() { + static dispatch_once_t sPred = 0; + static FlutterStandardMessageCodec *sSharedObject = nil; + dispatch_once(&sPred, ^{ + FLTPathProviderApiCodecReaderWriter *readerWriter = + [[FLTPathProviderApiCodecReaderWriter alloc] init]; + sSharedObject = [FlutterStandardMessageCodec codecWithReaderWriter:readerWriter]; + }); + return sSharedObject; +} + +void FLTPathProviderApiSetup(id binaryMessenger, + NSObject *api) { + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:@"dev.flutter.pigeon.PathProviderApi.getTemporaryPath" + binaryMessenger:binaryMessenger + codec:FLTPathProviderApiGetCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector(getTemporaryPathWithError:)], + @"FLTPathProviderApi api (%@) doesn't respond to @selector(getTemporaryPathWithError:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + FlutterError *error; + NSString *output = [api getTemporaryPathWithError:&error]; + callback(wrapResult(output, error)); + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:@"dev.flutter.pigeon.PathProviderApi.getApplicationSupportPath" + binaryMessenger:binaryMessenger + codec:FLTPathProviderApiGetCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(getApplicationSupportPathWithError:)], + @"FLTPathProviderApi api (%@) doesn't respond to " + @"@selector(getApplicationSupportPathWithError:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + FlutterError *error; + NSString *output = [api getApplicationSupportPathWithError:&error]; + callback(wrapResult(output, error)); + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:@"dev.flutter.pigeon.PathProviderApi.getLibraryPath" + binaryMessenger:binaryMessenger + codec:FLTPathProviderApiGetCodec()]; + if (api) { + NSCAssert( + [api respondsToSelector:@selector(getLibraryPathWithError:)], + @"FLTPathProviderApi api (%@) doesn't respond to @selector(getLibraryPathWithError:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + FlutterError *error; + NSString *output = [api getLibraryPathWithError:&error]; + callback(wrapResult(output, error)); + }]; + } else { + [channel setMessageHandler:nil]; + } + } + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:@"dev.flutter.pigeon.PathProviderApi.getApplicationDocumentsPath" + binaryMessenger:binaryMessenger + codec:FLTPathProviderApiGetCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(getApplicationDocumentsPathWithError:)], + @"FLTPathProviderApi api (%@) doesn't respond to " + @"@selector(getApplicationDocumentsPathWithError:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + FlutterError *error; + NSString *output = [api getApplicationDocumentsPathWithError:&error]; + callback(wrapResult(output, error)); + }]; + } else { + [channel setMessageHandler:nil]; + } + } +} diff --git a/packages/path_provider/path_provider_ios/lib/messages.g.dart b/packages/path_provider/path_provider_ios/lib/messages.g.dart new file mode 100644 index 000000000000..1914119b8bd8 --- /dev/null +++ b/packages/path_provider/path_provider_ios/lib/messages.g.dart @@ -0,0 +1,124 @@ +// 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. +// Autogenerated from Pigeon (v3.1.5), do not edit directly. +// See also: https://pub.dev/packages/pigeon +// ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, unused_shown_name +// @dart = 2.12 +import 'dart:async'; +import 'dart:typed_data' show Uint8List, Int32List, Int64List, Float64List; + +import 'package:flutter/foundation.dart' show WriteBuffer, ReadBuffer; +import 'package:flutter/services.dart'; + +class _PathProviderApiCodec extends StandardMessageCodec { + const _PathProviderApiCodec(); +} + +class PathProviderApi { + /// Constructor for [PathProviderApi]. The [binaryMessenger] named argument is + /// available for dependency injection. If it is left null, the default + /// BinaryMessenger will be used which routes to the host platform. + PathProviderApi({BinaryMessenger? binaryMessenger}) + : _binaryMessenger = binaryMessenger; + + final BinaryMessenger? _binaryMessenger; + + static const MessageCodec codec = _PathProviderApiCodec(); + + Future getTemporaryPath() async { + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.PathProviderApi.getTemporaryPath', codec, + binaryMessenger: _binaryMessenger); + final Map? replyMap = + await channel.send(null) as Map?; + if (replyMap == null) { + throw PlatformException( + code: 'channel-error', + message: 'Unable to establish connection on channel.', + ); + } else if (replyMap['error'] != null) { + final Map error = + (replyMap['error'] as Map?)!; + throw PlatformException( + code: (error['code'] as String?)!, + message: error['message'] as String?, + details: error['details'], + ); + } else { + return (replyMap['result'] as String?); + } + } + + Future getApplicationSupportPath() async { + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.PathProviderApi.getApplicationSupportPath', codec, + binaryMessenger: _binaryMessenger); + final Map? replyMap = + await channel.send(null) as Map?; + if (replyMap == null) { + throw PlatformException( + code: 'channel-error', + message: 'Unable to establish connection on channel.', + ); + } else if (replyMap['error'] != null) { + final Map error = + (replyMap['error'] as Map?)!; + throw PlatformException( + code: (error['code'] as String?)!, + message: error['message'] as String?, + details: error['details'], + ); + } else { + return (replyMap['result'] as String?); + } + } + + Future getLibraryPath() async { + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.PathProviderApi.getLibraryPath', codec, + binaryMessenger: _binaryMessenger); + final Map? replyMap = + await channel.send(null) as Map?; + if (replyMap == null) { + throw PlatformException( + code: 'channel-error', + message: 'Unable to establish connection on channel.', + ); + } else if (replyMap['error'] != null) { + final Map error = + (replyMap['error'] as Map?)!; + throw PlatformException( + code: (error['code'] as String?)!, + message: error['message'] as String?, + details: error['details'], + ); + } else { + return (replyMap['result'] as String?); + } + } + + Future getApplicationDocumentsPath() async { + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.PathProviderApi.getApplicationDocumentsPath', codec, + binaryMessenger: _binaryMessenger); + final Map? replyMap = + await channel.send(null) as Map?; + if (replyMap == null) { + throw PlatformException( + code: 'channel-error', + message: 'Unable to establish connection on channel.', + ); + } else if (replyMap['error'] != null) { + final Map error = + (replyMap['error'] as Map?)!; + throw PlatformException( + code: (error['code'] as String?)!, + message: error['message'] as String?, + details: error['details'], + ); + } else { + return (replyMap['result'] as String?); + } + } +} diff --git a/packages/path_provider/path_provider_ios/lib/path_provider_ios.dart b/packages/path_provider/path_provider_ios/lib/path_provider_ios.dart index 88becf20850e..05be0534764a 100644 --- a/packages/path_provider/path_provider_ios/lib/path_provider_ios.dart +++ b/packages/path_provider/path_provider_ios/lib/path_provider_ios.dart @@ -4,16 +4,13 @@ import 'dart:io'; -import 'package:flutter/foundation.dart' show visibleForTesting; -import 'package:flutter/services.dart'; import 'package:path_provider_platform_interface/path_provider_platform_interface.dart'; +import 'messages.g.dart'; /// The iOS implementation of [PathProviderPlatform]. class PathProviderIOS extends PathProviderPlatform { /// The method channel used to interact with the native platform. - @visibleForTesting - MethodChannel methodChannel = - const MethodChannel('plugins.flutter.io/path_provider_ios'); + final PathProviderApi _pathProvider = PathProviderApi(); /// Registers this class as the default instance of [PathProviderPlatform] static void registerWith() { @@ -22,13 +19,12 @@ class PathProviderIOS extends PathProviderPlatform { @override Future getTemporaryPath() async { - return methodChannel.invokeMethod('getTemporaryDirectory'); + return _pathProvider.getTemporaryPath(); } @override Future getApplicationSupportPath() async { - final String? path = await methodChannel - .invokeMethod('getApplicationSupportDirectory'); + final String? path = await _pathProvider.getApplicationSupportPath(); if (path != null) { // Ensure the directory exists before returning it, for consistency with // other platforms. @@ -39,13 +35,12 @@ class PathProviderIOS extends PathProviderPlatform { @override Future getLibraryPath() async { - return methodChannel.invokeMethod('getLibraryDirectory'); + return _pathProvider.getLibraryPath(); } @override Future getApplicationDocumentsPath() async { - return methodChannel - .invokeMethod('getApplicationDocumentsDirectory'); + return _pathProvider.getApplicationDocumentsPath(); } @override diff --git a/packages/path_provider/path_provider_ios/pigeons/copyright.txt b/packages/path_provider/path_provider_ios/pigeons/copyright.txt new file mode 100644 index 000000000000..1236b63caf3a --- /dev/null +++ b/packages/path_provider/path_provider_ios/pigeons/copyright.txt @@ -0,0 +1,3 @@ +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. diff --git a/packages/path_provider/path_provider_ios/pigeons/messages.dart b/packages/path_provider/path_provider_ios/pigeons/messages.dart new file mode 100644 index 000000000000..2ed79914e821 --- /dev/null +++ b/packages/path_provider/path_provider_ios/pigeons/messages.dart @@ -0,0 +1,21 @@ +// 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:pigeon/pigeon.dart'; + +@ConfigurePigeon(PigeonOptions( + input: 'pigeons/messages.dart', + objcOptions: ObjcOptions(prefix: 'FLT'), + objcHeaderOut: 'ios/Classes/messages.g.h', + objcSourceOut: 'ios/Classes/messages.g.m', + dartOut: 'lib/messages.g.dart', + dartTestOut: 'test/messages_test.g.dart', + copyrightHeader: 'pigeons/copyright.txt', +)) +@HostApi(dartHostTestHandler: 'TestPathProviderApi') +abstract class PathProviderApi { + String? getTemporaryPath(); + String? getApplicationSupportPath(); + String? getLibraryPath(); + String? getApplicationDocumentsPath(); +} diff --git a/packages/path_provider/path_provider_ios/pubspec.yaml b/packages/path_provider/path_provider_ios/pubspec.yaml index d6c7de108c97..16d2f2e9021e 100644 --- a/packages/path_provider/path_provider_ios/pubspec.yaml +++ b/packages/path_provider/path_provider_ios/pubspec.yaml @@ -2,11 +2,11 @@ name: path_provider_ios description: iOS implementation of the path_provider plugin. repository: https://github.com/flutter/plugins/tree/main/packages/path_provider/path_provider_ios issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+path_provider%22 -version: 2.0.9 +version: 2.0.10 environment: sdk: ">=2.14.0 <3.0.0" - flutter: ">=2.8.0" + flutter: ">=3.0.0" flutter: plugin: @@ -29,5 +29,6 @@ dev_dependencies: integration_test: sdk: flutter path: ^1.8.0 + pigeon: ^3.1.5 plugin_platform_interface: ^2.0.0 test: ^1.16.0 diff --git a/packages/path_provider/path_provider_ios/test/messages_test.g.dart b/packages/path_provider/path_provider_ios/test/messages_test.g.dart new file mode 100644 index 000000000000..d1c9ff88dca1 --- /dev/null +++ b/packages/path_provider/path_provider_ios/test/messages_test.g.dart @@ -0,0 +1,88 @@ +// 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. +// Autogenerated from Pigeon (v3.1.5), do not edit directly. +// See also: https://pub.dev/packages/pigeon +// ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis +// ignore_for_file: avoid_relative_lib_imports +// @dart = 2.12 +import 'dart:async'; +import 'dart:typed_data' show Uint8List, Int32List, Int64List, Float64List; +import 'package:flutter/foundation.dart' show WriteBuffer, ReadBuffer; +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import '../lib/messages.g.dart'; + +class _TestPathProviderApiCodec extends StandardMessageCodec { + const _TestPathProviderApiCodec(); +} + +abstract class TestPathProviderApi { + static const MessageCodec codec = _TestPathProviderApiCodec(); + + String? getTemporaryPath(); + String? getApplicationSupportPath(); + String? getLibraryPath(); + String? getApplicationDocumentsPath(); + static void setup(TestPathProviderApi? api, + {BinaryMessenger? binaryMessenger}) { + { + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.PathProviderApi.getTemporaryPath', codec, + binaryMessenger: binaryMessenger); + if (api == null) { + channel.setMockMessageHandler(null); + } else { + channel.setMockMessageHandler((Object? message) async { + // ignore message + final String? output = api.getTemporaryPath(); + return {'result': output}; + }); + } + } + { + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.PathProviderApi.getApplicationSupportPath', codec, + binaryMessenger: binaryMessenger); + if (api == null) { + channel.setMockMessageHandler(null); + } else { + channel.setMockMessageHandler((Object? message) async { + // ignore message + final String? output = api.getApplicationSupportPath(); + return {'result': output}; + }); + } + } + { + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.PathProviderApi.getLibraryPath', codec, + binaryMessenger: binaryMessenger); + if (api == null) { + channel.setMockMessageHandler(null); + } else { + channel.setMockMessageHandler((Object? message) async { + // ignore message + final String? output = api.getLibraryPath(); + return {'result': output}; + }); + } + } + { + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.PathProviderApi.getApplicationDocumentsPath', + codec, + binaryMessenger: binaryMessenger); + if (api == null) { + channel.setMockMessageHandler(null); + } else { + channel.setMockMessageHandler((Object? message) async { + // ignore message + final String? output = api.getApplicationDocumentsPath(); + return {'result': output}; + }); + } + } + } +} diff --git a/packages/path_provider/path_provider_ios/test/path_provider_ios_test.dart b/packages/path_provider/path_provider_ios/test/path_provider_ios_test.dart index 40f81c5f445a..16a7cd8d71a2 100644 --- a/packages/path_provider/path_provider_ios/test/path_provider_ios_test.dart +++ b/packages/path_provider/path_provider_ios/test/path_provider_ios_test.dart @@ -4,17 +4,35 @@ import 'dart:io'; -import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:path/path.dart' as p; import 'package:path_provider_ios/path_provider_ios.dart'; +import 'messages_test.g.dart'; + +class _Api implements TestPathProviderApi { + String? applicationDocumentsPath; + String? applicationSupportPath; + String? libraryPath; + String? temporaryPath; + + @override + String? getApplicationDocumentsPath() => applicationDocumentsPath; + + @override + String? getApplicationSupportPath() => applicationSupportPath; + + @override + String? getLibraryPath() => libraryPath; + + @override + String? getTemporaryPath() => temporaryPath; +} void main() { TestWidgetsFlutterBinding.ensureInitialized(); group('PathProviderIOS', () { late PathProviderIOS pathProvider; - late List log; // These unit tests use the actual filesystem, since an injectable // filesystem would add a runtime dependency to the package, so everything // is contained to a temporary directory. @@ -24,6 +42,7 @@ void main() { late String applicationSupportPath; late String libraryPath; late String applicationDocumentsPath; + late _Api api; setUp(() async { pathProvider = PathProviderIOS(); @@ -37,24 +56,12 @@ void main() { applicationDocumentsPath = p.join(basePath, 'application', 'documents', 'path'); - log = []; - TestDefaultBinaryMessengerBinding.instance!.defaultBinaryMessenger - .setMockMethodCallHandler(pathProvider.methodChannel, - (MethodCall methodCall) async { - log.add(methodCall); - switch (methodCall.method) { - case 'getTemporaryDirectory': - return temporaryPath; - case 'getApplicationSupportDirectory': - return applicationSupportPath; - case 'getLibraryDirectory': - return libraryPath; - case 'getApplicationDocumentsDirectory': - return applicationDocumentsPath; - default: - return null; - } - }); + api = _Api(); + api.applicationDocumentsPath = applicationDocumentsPath; + api.applicationSupportPath = applicationSupportPath; + api.libraryPath = libraryPath; + api.temporaryPath = temporaryPath; + TestPathProviderApi.setup(api); }); tearDown(() { @@ -63,21 +70,11 @@ void main() { test('getTemporaryPath', () async { final String? path = await pathProvider.getTemporaryPath(); - expect( - log, - [isMethodCall('getTemporaryDirectory', arguments: null)], - ); expect(path, temporaryPath); }); test('getApplicationSupportPath', () async { final String? path = await pathProvider.getApplicationSupportPath(); - expect( - log, - [ - isMethodCall('getApplicationSupportDirectory', arguments: null) - ], - ); expect(path, applicationSupportPath); }); @@ -89,21 +86,11 @@ void main() { test('getLibraryPath', () async { final String? path = await pathProvider.getLibraryPath(); - expect( - log, - [isMethodCall('getLibraryDirectory', arguments: null)], - ); expect(path, libraryPath); }); test('getApplicationDocumentsPath', () async { final String? path = await pathProvider.getApplicationDocumentsPath(); - expect( - log, - [ - isMethodCall('getApplicationDocumentsDirectory', arguments: null) - ], - ); expect(path, applicationDocumentsPath); });