Ensuring Secure Invocation of Native Code in Flutter Using Pigeon
Why to use Pigeon? :
How to use Pigeon? :
dependencies:
flutter:
sdk: flutter
cupertino_icons: ^1.0.2
pigeon:
import 'package:pigeon/pigeon.dart';
@HostApi()
abstract class MyDataApi {
@async
ResponseData sendData(MyData data);
}
class MyData {
String? name;
int? age;
}
class ResponseData {
String? name;
}
3. Run the following command to generate necessary files (pigeon.m, pigeon.h, and pigeon.g.dart):
Recommended by LinkedIn
flutter pub run pigeon \
--input lib/pigeon.dart \
--dart_out lib/pigeon.g.dart \
--objc_header_out ios/Runner/pigeon.h \
--objc_source_out ios/Runner/pigeon.m
4. Import pigeon.h and pigeon.m into your Xcode project and add pigeon.h to the Runner-Bridging-Header.
#import "pigeon.h"
5. Create a new class in Xcode, CustomMyDataAPI, to handle the native API calls.
public class CustomMyDataAPI: NSObject, MyDataApi {
public func sendDataData(_ data: MyData, completion: @escaping (ResponseData?, FlutterError?) -> Void) {
let responseData = ResponseData.init()
responseData.name = data.name! + "from native"
completion(responseData,nil)
}
}
6. Import pigeon.g.dart into the Dart file where you want to invoke the native method.
7. Implement a function to invoke the native method.
Future<void> onClick() async {
print("on click called");
MyDataApi v = MyDataApi();
MyData data = MyData();
data.name = "john academy";
data.age = 20;
ResponseData response = await v.sendData(data);
setState(() {
val = response.name ?? "No value received";
});
}
Link to repository :