Capacitor V3:
I’m trying simply to send an event from Android to JS. My plugin is working so far otherwise.
Does anyone have a working example of just calling JS from Android, no params?
Both of the documentation below have issues when I try to follow either approach:
I’ve tried the following:
import { MyPlugin } from 'capacitor-plugin-myplugin';
MyPlugin.addEventListener('myEvent', () => {
// ....
})
But I get:
Property 'addListener' does not exist on type 'MyPlugin'.
If I extend my plugin class in the Java and do:
public class MyPlugin extends Plugin {
//....
then call:
bridge.triggerJSEvent("finishedPlaying", "window");
I get:
java.lang.NullPointerException: Attempt to invoke virtual method 'void com.getcapacitor.Bridge.triggerJSEvent(java.lang.String, java.lang.String)' on a null object reference
1 Like
Hi,
I have exactly same problem. Have you found any solution?
Damn, this forum is like a graveyard sometimes. Either that or no one actually knows what they’re doing.
So yeah, I ended up doing the following:
- Override the load() function in your plugin class
- Store a reference to the bridge object
- Use that reference to call the trigger events instead.
e.g in your main plugin class:
public class MyPlugin extends Plugin {
Bridge myBridge;
@Override
public void load() {
myBridge = bridge;
}
@PluginMethod
public void someCall(PluginCall call) {
// do whatever you're doing.
myBridge.triggerJSEvent(....)
}
}
3 Likes
I found another solution. I looked it up at the existing capacitor App plugin.
You have to extend your definition file.
import type { PluginListenerHandle } from '@capacitor/core';
export type ScanButtonPressedListener = () => void;
/**
* Listen for scanButtonPressed
*
* @since 1.0.0
*/
addListener(
eventName: 'scanButtonPressed',
listenerFunc: ScanButtonPressedListener,
): Promise<PluginListenerHandle> & PluginListenerHandle;
1 Like
I am experiencing ‘addListener’ does not exist on plugin as well.
Property ‘addListener’ does not exist on type ‘MyPlugin’
Extending with Plugin interface provided by capacitor helps
import {registerPlugin} from "@capacitor/core";
import {Plugin} from "@capacitor/core/types/definitions";
export interface BleDemoPlugin extends Plugin{
scanForReader(options: { value: string }): Promise<{ value: string }>;
}
1 Like
Us Typescript lovers will do just fine reverting to the ancient days of Javascript by essentially telling our compiler, “hold my beer.”
const eventListener = await (MyPlugin as any).addListener('eventName', (eventData: any) => this.doThings(eventData) );
1 Like
Hi, i guess it has been a bit too late, but here is correct solution:
in the ‘definitions.ts’ of your plugin project,
import ‘Plugin’ interface from ‘@capacitor/core’ and extend your interface definition, done
code snipes as following
import { Plugin } from '@capacitor/core'
export interface MyPlugin6Plugin extends Plugin {
echo(options: { value: string }): Promise<{ value: string }>;
}
2 Likes