@nativescript/flutter
Version:
Flutter for NativeScript
130 lines • 5.59 kB
JavaScript
import { Utils } from '@nativescript/core';
import { FlutterCommon } from './common';
function makeFragmentName(viewId) {
return 'android:flutter:' + viewId;
}
let initialized = false;
let flutterEngineGroup;
const ReplyMethod = (io.flutter.plugin.common.BasicMessageChannel.Reply);
export function init() {
if (!initialized) {
initialized = true;
flutterEngineGroup = new io.flutter.embedding.engine.FlutterEngineGroup(Utils.android.getApplicationContext());
}
}
var BasicMessageChannelHandler = /** @class */ (function (_super) {
__extends(BasicMessageChannelHandler, _super);
function BasicMessageChannelHandler() {
var _this = _super.call(this) || this;
return global.__native(_this);
}
BasicMessageChannelHandler_1 = BasicMessageChannelHandler;
BasicMessageChannelHandler.initWithOwner = function (owner) {
var instance = new BasicMessageChannelHandler_1();
instance.owner = owner;
return instance;
};
BasicMessageChannelHandler.prototype.onMessage = function (message, reply) {
var _a, _b;
try {
var flutterMessage = JSON.parse(message);
if (flutterMessage) {
if (Flutter.DEBUG) {
console.log('Flutter called NativeScript with type:', flutterMessage.type);
console.log('data:', flutterMessage.data);
}
var owner = (_a = this.owner) === null || _a === void 0 ? void 0 : _a.deref();
if (owner) {
if ((_b = owner.channel) === null || _b === void 0 ? void 0 : _b[flutterMessage.type]) {
owner.channel[flutterMessage.type](flutterMessage.data);
}
}
}
}
catch (err) {
console.log('Flutter message error:', err);
}
};
var BasicMessageChannelHandler_1;
BasicMessageChannelHandler = BasicMessageChannelHandler_1 = __decorate([
Interfaces([(io.flutter.plugin.common.BasicMessageChannel.MessageHandler)]),
__metadata("design:paramtypes", [])
], BasicMessageChannelHandler);
return BasicMessageChannelHandler;
}(java.lang.Object));
export class Flutter extends FlutterCommon {
constructor() {
super(...arguments);
this._androidViewId = -1;
}
createNativeView() {
if (!this.id) {
throw new Error(`Flutter requires an 'id' property set to match your Dart entry point name.`);
}
if (!flutterEngineGroup) {
throw new Error(`Ensure you have called /flutter 'init' from you main bootstrap file.`);
}
this._flutterEngine = flutterEngineGroup.createAndRunEngine(Utils.android.getApplicationContext(), new io.flutter.embedding.engine.dart.DartExecutor.DartEntrypoint(null, this.id), null);
// cache the engine
io.flutter.embedding.engine.FlutterEngineCache.getInstance().put(this.id, this._flutterEngine);
// register for plugins
io.flutter.embedding.engine.plugins.util.GeneratedPluginRegister.registerGeneratedPlugins(this._flutterEngine);
this._platformChannel = new io.flutter.plugin.common.BasicMessageChannel(this._flutterEngine.getDartExecutor().getBinaryMessenger(), 'nativescript', io.flutter.plugin.common.StringCodec.INSTANCE);
this._listener = BasicMessageChannelHandler.initWithOwner(new WeakRef(this));
this._platformChannel.setMessageHandler(this._listener);
return new android.widget.FrameLayout(this._context);
}
initNativeView() {
super.initNativeView();
if (this._androidViewId < 0) {
this._androidViewId = android.view.View.generateViewId();
}
this.nativeViewProtected.setId(this._androidViewId);
const fm = this._getFragmentManager();
const engineFragmentBuilder = io.flutter.embedding.android.FlutterFragment.withCachedEngine(this.id).renderMode(io.flutter.embedding.android.RenderMode.texture);
this._fragment = engineFragmentBuilder.build();
const name = makeFragmentName(this._androidViewId);
const tr = fm.beginTransaction();
tr.replace(this._androidViewId, this._fragment, name);
tr.commit();
}
disposeNativeView() {
if (this._platformChannel) {
this._platformChannel.setMessageHandler(null);
}
this._platformChannel = null;
this._listener = null;
}
sendMessage(type, data, callback) {
if (this._platformChannel) {
const message = {
type,
};
if (data) {
message.data = data;
}
try {
const json = JSON.stringify(message, null, 0);
this._platformChannel.send(json, new ReplyMethod({
reply: (result) => {
this.notify({
eventName: Flutter.sendMessageReplyEvent,
object: this,
data: result,
});
if (callback) {
callback(result);
}
},
}));
if (Flutter.DEBUG) {
console.log('NativeScript sent message to Flutter:', json);
}
}
catch (err) {
console.log('Flutter message error:', err);
}
}
}
}
//# sourceMappingURL=index.android.js.map