ScreenOrientation.lockOrientation raises error, however orientation is changing.
This happens after updated for the issue
ionic-native: "2.4.1"
console.error: EXCEPTION: Uncaught (in promise): TypeError: undefined is not an object (evaluating
'pluginResult.then') http://172.26.9.242:8100/build/main.js:418:21
http://172.26.9.242:8100/build/main.js:371:19 t@http://172.26.9.242:8100/build/polyfills.js:3:11330
tryNativePromise@http://172.26.9.242:8100/build/main.js:370:31
ionViewWillUnload@http://172.26.9.242:8100/build/main.js:62499:96
_lifecycle@http://172.26.9.242:8100/build/main.js:8632:37
_willUnload@http://172.26.9.242:8100/build/main.js:8577:24
_willUnload@http://172.26.9.242:8100/build/main.js:33508:25
_cleanup@http://172.26.9.242:8100/build/main.js:33442:33
_trnsFinish@http://172.26.9.242:8100/build/main.js:33367:26 [native code]
onInvoke@http://172.26.9.242:8100/build/main.js:40827:43
run@http://172.26.9.242:8100/build/polyfills.js:3:6487 http://172.26.9.242:8100/build/main.js:33311:28
_didFinish@http://172.26.9.242:8100/build/main.js:11497:29
_didFinishAll@http://172.26.9.242:8100/build/main.js:11484:28
onTransitionEnd@http://172.26.9.242:8100/build/main.js:10931:31
onTransitionEnd@http://172.26.9.242:8100/build/main.js:6512:25
[18:08:43] console.error: ORIGINAL STACKTRACE:
[18:08:43] console.error: s@http://172.26.9.242:8100/build/polyfills.js:3:4220
t@http://172.26.9.242:8100/build/polyfills.js:3:11356
tryNativePromise@http://172.26.9.242:8100/build/main.js:370:31
ionViewWillUnload@http://172.26.9.242:8100/build/main.js:62499:96
_lifecycle@http://172.26.9.242:8100/build/main.js:8632:37
_willUnload@http://172.26.9.242:8100/build/main.js:8577:24
_willUnload@http://172.26.9.242:8100/build/main.js:33508:25
_cleanup@http://172.26.9.242:8100/build/main.js:33442:33
_trnsFinish@http://172.26.9.242:8100/build/main.js:33367:26 [native code]
onInvoke@http://172.26.9.242:8100/build/main.js:40827:43
run@http://172.26.9.242:8100/build/polyfills.js:3:6487 http://172.26.9.242:8100/build/main.js:33311:28
_didFinish@http://172.26.9.242:8100/build/main.js:11497:29
_didFinishAll@http://172.26.9.242:8100/build/main.js:11484:28
onTransitionEnd@http://172.26.9.242:8100/build/main.js:10931:31
onTransitionEnd@http://172.26.9.242:8100/build/main.js:6512:25
Same issue here, the method call works but it raises an error too :
main.js:100585 EXCEPTION: Uncaught (in promise): TypeError: Cannot read property 'then' of undefined
TypeError: Cannot read property 'then' of undefined
at file:///android_asset/www/build/main.js:564:21
at file:///android_asset/www/build/main.js:517:17
at new t (file:///android_asset/www/build/polyfills.js:3:11329)
at tryNativePromise (file:///android_asset/www/build/main.js:516:20)
at getPromise (file:///android_asset/www/build/main.js:538:16)
at wrapOtherPromise (file:///android_asset/www/build/main.js:559:12)
at Function.<anonymous> (file:///android_asset/www/build/main.js:708:20)
at Function.value [as lockOrientation] (file:///android_asset/www/build/main.js:772:53)
at ScreenOrientationService.init (file:///android_asset/www/build/main.js:85542:85)
at file:///android_asset/www/build/main.js:163401:38
ErrorHandler.handleError @ main.js:100585
next @ main.js:79754
schedulerFn @ main.js:81264
SafeSubscriber.__tryOrUnsub @ main.js:5600
SafeSubscriber.next @ main.js:5549
Subscriber._next @ main.js:5502
Subscriber.next @ main.js:5466
Subject.next @ main.js:10408
EventEmitter.emit @ main.js:81256
NgZone.triggerError @ main.js:82106
onHandleError @ main.js:82085
t.handleError @ polyfills.js:3
e.runGuarded @ polyfills.js:3
r @ polyfills.js:3
i @ polyfills.js:3
main.js:100590 ORIGINAL STACKTRACE:
ErrorHandler.handleError @ main.js:100590
next @ main.js:79754
schedulerFn @ main.js:81264
SafeSubscriber.__tryOrUnsub @ main.js:5600
SafeSubscriber.next @ main.js:5549
Subscriber._next @ main.js:5502
Subscriber.next @ main.js:5466
Subject.next @ main.js:10408
EventEmitter.emit @ main.js:81256
NgZone.triggerError @ main.js:82106
onHandleError @ main.js:82085
t.handleError @ polyfills.js:3
e.runGuarded @ polyfills.js:3
r @ polyfills.js:3
i @ polyfills.js:3
main.js:100591 Error: Uncaught (in promise): TypeError: Cannot read property 'then' of undefined
TypeError: Cannot read property 'then' of undefined
at main.js:564
at main.js:517
at new t (polyfills.js:3)
at tryNativePromise (main.js:516)
at getPromise (main.js:538)
at wrapOtherPromise (main.js:559)
at Function.<anonymous> (main.js:708)
at Function.value [as lockOrientation] (main.js:772)
at ScreenOrientationService.init (main.js:85542)
at main.js:163401
at s (polyfills.js:3)
at s (polyfills.js:3)
at polyfills.js:3
at t.invokeTask (polyfills.js:3)
at Object.onInvokeTask (main.js:82055)
at t.invokeTask (polyfills.js:3)
at e.runTask (polyfills.js:3)
at i (polyfills.js:3)
ErrorHandler.handleError @ main.js:100591
next @ main.js:79754
schedulerFn @ main.js:81264
SafeSubscriber.__tryOrUnsub @ main.js:5600
SafeSubscriber.next @ main.js:5549
Subscriber._next @ main.js:5502
Subscriber.next @ main.js:5466
Subject.next @ main.js:10408
EventEmitter.emit @ main.js:81256
NgZone.triggerError @ main.js:82106
onHandleError @ main.js:82085
t.handleError @ polyfills.js:3
e.runGuarded @ polyfills.js:3
r @ polyfills.js:3
i @ polyfills.js:3
polyfills.js:3 Unhandled Promise rejection: Cannot read property 'then' of undefined ; Zone: angular ; Task: Promise.then ; Value: TypeError: Cannot read property 'then' of undefined
at main.js:564
at main.js:517
at new t (polyfills.js:3)
at tryNativePromise (main.js:516)
at getPromise (main.js:538)
at wrapOtherPromise (main.js:559)
at Function.<anonymous> (main.js:708)
at Function.value [as lockOrientation] (main.js:772)
at ScreenOrientationService.init (main.js:85542)
at main.js:163401 TypeError: Cannot read property 'then' of undefined
at file:///android_asset/www/build/main.js:564:21
at file:///android_asset/www/build/main.js:517:17
at new t (file:///android_asset/www/build/polyfills.js:3:11329)
at tryNativePromise (file:///android_asset/www/build/main.js:516:20)
at getPromise (file:///android_asset/www/build/main.js:538:16)
at wrapOtherPromise (file:///android_asset/www/build/main.js:559:12)
at Function.<anonymous> (file:///android_asset/www/build/main.js:708:20)
at Function.value [as lockOrientation] (file:///android_asset/www/build/main.js:772:53)
at ScreenOrientationService.init (file:///android_asset/www/build/main.js:85542:85)
at file:///android_asset/www/build/main.js:163401:38
o @ polyfills.js:3
r @ polyfills.js:3
i @ polyfills.js:3
polyfills.js:3 Error: Uncaught (in promise): TypeError: Cannot read property 'then' of undefined
TypeError: Cannot read property 'then' of undefined
at main.js:564
at main.js:517
at new t (polyfills.js:3)
at tryNativePromise (main.js:516)
at getPromise (main.js:538)
at wrapOtherPromise (main.js:559)
at Function.<anonymous> (main.js:708)
at Function.value [as lockOrientation] (main.js:772)
at ScreenOrientationService.init (main.js:85542)
at main.js:163401
at main.js:564
at main.js:517
at new t (polyfills.js:3)
at tryNativePromise (main.js:516)
at getPromise (main.js:538)
at wrapOtherPromise (main.js:559)
at Function.<anonymous> (main.js:708)
at Function.value [as lockOrientation] (main.js:772)
at ScreenOrientationService.init (main.js:85542)
at main.js:163401
at s (polyfills.js:3)
at s (polyfills.js:3)
at polyfills.js:3
at t.invokeTask (polyfills.js:3)
at Object.onInvokeTask (main.js:82055)
at t.invokeTask (polyfills.js:3)
at e.runTask (polyfills.js:3)
at i (polyfills.js:3)
The method ScreenOrientation.lockOrientation is called this way and worked perfectly fine until ionic-native update 2.4.1.
if (this.platform.is('cordova')) {
ScreenOrientation.lockOrientation(this.getOrientation());
}
~Same for me. TypeError: Cannot read property 'then' of undefined
But it should return a promise: https://github.com/apache/cordova-plugin-screen-orientation/blob/master/www/screenorientation.js#L71~
BTW: One Thousand and One issues!
Edit: This fixes the problem
ionic plugin rm cordova-plugin-screen-orientation --save
ionic plugin add https://github.com/apache/cordova-plugin-screen-orientation --save
Who knows how to update the link which ionic plugin add is using? Is it fetched from npm? Do we have to contact the author of the old repository or how does this work?
@RafaelKr I tried rm/add plugin and after first app execution error was not occurred. All subsequent app executions failed with the original error. Even if you try to rm/add plugin before each app execution further it fails constantly. So, looks like a glitch.
@ivanovvitaly Try to do a platform rm and then platform add again. Sometimes it works like magic.
Try adding @latest when installing. Example:
ionic plugin add cordova-plugin-screen-orientation@latest
@ihadeed We can't use
ionic/cordova plugin add cordova-plugin-screen-orientation@latest
Because it will use the npm registry which point to this git repo : https://github.com/gbenvenuti/cordova-plugin-screen-orientation
But this repo is not maintened anymore, instead we must use the official appache one : https://github.com/apache/cordova-plugin-screen-orientation
The version 1.4.2 (present in npm, in the old git repo and as the latest release of the appache repo) causes the issue.
Only the latest version (2.0.0 as stated in the changelod but not tagged yet) fixes the issue (for me at least).
So, just remove the plugin and install it again with :
cordova plugin add https://github.com/apache/cordova-plugin-screen-orientation --save
@ihadeed Latest doesn't help. Code below raises error
ScreenOrientation.lockOrientation('portrait').then(() => {
console.log('locked');
});
@RafaelKr I missed you are using apache url.
I installed plugin from repo https://github.com/apache/cordova-plugin-screen-orientation and screen orientation stoped working completely.
If i use code below it runs without errors and prints to console, but screen is not being rotated!
ScreenOrientation.lockOrientation('portrait').then(() => {
console.log('locked');
});
@ivanovvitaly On which platform are you testing it ?
On Android 7.1.1 (Nexus 5x), it does lock and rotate the screen with the last version from Apache repo.
Need to test on iOS thought.
@ivanovvitaly Maybe you can try this:
ionic plugin rm cordova-plugin-screen-orientation --save
ionic plugin add https://github.com/apache/cordova-plugin-screen-orientation --save
ionic platform rm android --save
ionic platform add android --save
Or, if you want to clean everything (you may have other platforms than Android) :
delete /platforms directory
delete /plugins directory
Then run :
cordova plugin rm cordova-plugin-screen-orientation --save
cordova plugin add https://github.com/apache/cordova-plugin-screen-orientation --save
cordova prepare
I set up new project from scratch and installed screen orientation plugin from apache repo.
Android: confirm code executes without errors and screen orientation changes.
iOS: code executes without errors, however screens orientation doesn't change. Tested on iOS 10.2
@TomDemulierChevret thanks for pointing that out.
I will probably revert the change and make our wrapper work with the npm package since that's what everybody has installed. Then I will publish this as a breaking change in [email protected].
@ivanovvitaly: Is the old plugin working on iOS 10.2?
@ihadeed: If the old plugin also doesn't work on iOS 10.2, then I think the best solution would be, if the apache package is installed, if you install cordova-plugin-screen-orientation. What would be the steps to change this? Do we have to contact the old maintainer to change the github URL in his npm repo? If that would be done, then you could keep the change.
@RafaelKr Yes, the old pluging that is installed by default is working on both platforms, inspite of it raises error
@RafaelKr the old developer needs to give apache the permission to publish the plugin on npm.
I've got the same error. I followed the steps above but they didn't solve my problem.
I set ionic-native to 2.4.0 in package.json file while Guys resolving the issue. ScreenOrientation.lockOrientation() doesn't return promise in 2.4.0, but works fine on both platforms and without errors.
Any update on this? Still seeing the issue with "ionic-native": "2.5.1"
@TomDemulierChevret guide helped me. I am using ionic-native 2.5.1 and cordova plugin add https://github.com/apache/cordova-plugin-screen-orientation --save is the correct way to add the plugin.
Facing the same bug. Tried the solution with Apache. Any ideas? Thank you!
@JiaLiPassion thank you! How can I test your fix, before it was merged with a master branch?
@supryin , I just tested it in my environment, you can try with the attached dist file which I built with the fix.
dist.zip
@JiaLiPassion thank you! I tried. Copied the files into ...node_modules\ionic-native. Still getting the same error. But this time if I write ScreenOrientation.lockOrientation("landscape"); without setTimeout the video even doesn't start playing. With old version of the plugin the video started to play with that code.
@supryin, I also tried in my application, the error is gone, so could debug with chrome://inspect to see the {sync:true} is passed into Cordova correctly? could you post your sample application?
@JiaLiPassion how can I check if the dist folder is built into the app?
@supryin , you can just open your vendor.bundle.js(or main.bundle.js), to look for the string below
__decorate([
__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__plugin__["g" /* Cordova */])({ sync: true })
], ScreenOrientation, "lockOrientation", null);
in the original version, the property will be {otherPromise: true}
@JiaLiPassion I clearly see a change in the behavior: with a new version ,the video doesn't start playing. with an old version it starts to play. In both cases there is the error. No other code changed.
I am working with Ionic 2 and I have this code in my main.js:
var ScreenOrientation = (function () {
function ScreenOrientation() {
}
/*
* Lock the orientation to the passed value.
* See below for accepted values
* @param orientation {string} The orientation which should be locked. Accepted values see table below.
* @returns {Promise
*/
ScreenOrientation.lockOrientation = function (orientation) { };
/
* Unlock and allow all orientations.
*/
ScreenOrientation.unlockOrientation = function () { };
__decorate$86([
Cordova({ sync: true })
], ScreenOrientation, "lockOrientation", null);
__decorate$86([
Cordova({ sync: true })
], ScreenOrientation, "unlockOrientation", null);
__decorate$86([
CordovaProperty
], ScreenOrientation, "orientation", void 0);
ScreenOrientation = __decorate$86([
Plugin({
pluginName: 'ScreenOrientation',
plugin: 'cordova-plugin-screen-orientation',
pluginRef: 'window.screen',
repo: 'https://github.com/apache/cordova-plugin-screen-orientation',
platforms: ['Android', 'iOS', 'Windows Phone 8']
})
], ScreenOrientation);
return ScreenOrientation;
}())
@supryin, can you debug your code when lockOritentaiton, to see this code in ionic-native
var wrap = function (pluginObj, methodName, opts) {
if (opts === void 0) { opts = {}; }
return function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i - 0] = arguments[_i];
}
if (opts.sync) {
// Sync doesn't wrap the plugin with a promise or observable, it returns the result as-is
return callCordovaPlugin(pluginObj, methodName, args, opts);
}
else if (opts.observable) {
return wrapObservable(pluginObj, methodName, args, opts);
}
else if (opts.eventObservable && opts.event) {
return wrapEventObservable(opts.event, opts.element);
}
else if (opts.otherPromise) {
return wrapOtherPromise(pluginObj, methodName, args, opts);
}
else {
return wrapPromise(pluginObj, methodName, args, opts);
}
};
to find out the opts content is {sync: true} or not
@JiaLiPassion I'll try in a few minutes. Reinstalling ionic & cordova . Just in case...
@supryin , sure , I use ionic-native 2.5.1, cordova 6.5.0
@JiaLiPassion ok. reinstalled. copied your dist into the ionic-native. debug started: sync=true, the error remains.
@supryin, could you post the error stack trace?
@JiaLiPassion here it is:
TypeError: Cannot read property 'apply' of undefined
at callCordovaPlugin (http://localhost:8100/build/main.js:77717:38)
at Function.
at Function.value [as lockOrientation] (http://localhost:8100/build/main.js:77980:53)
at OnboardingStartComponent.playVideo (http://localhost:8100/build/main.js:115848:31)
at CompiledTemplate.proxyViewClass.View_OnboardingStartComponent0.handleEvent_6 (/AppModule/OnboardingStartComponent/component.ngfactory.js:247:34)
at CompiledTemplate.proxyViewClass.
at HTMLVideoElement.
at t.invokeTask (http://localhost:8100/build/polyfills.js:3:9723)
at Object.onInvokeTask (http://localhost:8100/build/main.js:7478:37)
at t.invokeTask (http://localhost:8100/build/polyfills.js:3:9659)
It is because pluginInstance doesn't have the methodName, could you debug
at callCordovaPlugin (http://localhost:8100/build/main.js:77717:38)
in your code, to see, pluginInstance's properties, and methodName, I think you may use the wrong version of screen oritentation.
@JiaLiPassion here it is:

@supryin, please open pluginInstance and pluginObj to see all their methods. And what's your version of screen orientaion?
@JiaLiPassion I installed from my package.json:
"cordovaPlugins": [
"cordova-plugin-device",
"cordova-plugin-console",
"cordova-plugin-whitelist",
"cordova-plugin-splashscreen",
"cordova-plugin-statusbar",
"cordova-plugin-inappbrowser",
"cordova-plugin-pin-dialog",
"cordova-plugin-google-analytics",
"ionic-plugin-keyboard",
"cordova-plugin-screen-orientation"
],
and I use ionic-native 2.5.1
Methods are coming...
@JiaLiPassion here:


@JiaLiPassion looks like your last comment got deleted
@supryin , yes,
@JiaLiPassion here:

@supryin, it seems the pluginReference is not correct, pluginObject is ok, could you post your repository?
@JiaLiPassion what do you mean by post the repository?
@supryin , means upload your whole project to a github repository , so I can download and debug it.
you test it on android/iOS? OS version?
@JiaLiPassion I am sorry ,I cant do this. It is a corporate project.
I am testing in Chrome / Windows and did tests on Android 6.
However. I just made a new release build for Android and ... it works. It still doesn't work on Windows / Chrome.
@supryin , sure, what is your test environment, (android/ios) and version? you can simply test with a very simple page to see the object return from
window['Screen']
it seems it return a non complete instance.
And you can also debug
addScreenOrientationApi method in cordova-plugin-screen-orientation/www/screenorientation.js
to see the screenObject before and after the function.
if you can post a sample repository(not your project of your company but a very simple project only include Screen Orietation plugin) to demo the issue, I can help you with it.
@JiaLiPassion thank you! I'll try. I will also test it on iOS. For now it doesn't work on Windows 10/ Chrome, but works on Android 5
@supryin, the plugin may support windows 10 Store application, but I think it may not support chrome on windows 10. Android/iOS should work as expected.
@supryin, did you solve your problem with the error, "TypeError: Cannot read property 'apply' of undefined"? I have the same issue here .....
@saridakis yes, on Android and iOS. Use the dist.zip provided by @JiaLiPassion . On Windows / Chrome the error still there. Meanwhile, I think, the master branch was updated with the fix, so you should be able to just add the working version over npm.
@supryin one more question... which repository did you use? this one 'cordova plugin add https://github.com/apache/cordova-plugin-screen-orientation --save' or this 'cordova plugin add cordova-plugin-screen-orientation --save'? With the latest the error has been fixed, but on IOS, the command lockOrientation does nothing .... with the first one, on IOS, I get a message that no plugin is installed .... IOS version is 10.11
@saridakis I reference it in my package.json and install it with the latest ionic native.
if anyone still looking for solving this issue ...
the solution is just update your ionic-native to latest version which is 2.8.0 now.
how to ? : first check your ionic-native version by typing "npm list ionic-native" if its not 2.8.0 then this is your issue solve it by running "npm update ionic-native" and check if it's updated, if not then just go to your package.json and change version of ionic-native to 2.8.0 then go back and run npm install !
this will solve the issue ... and it worked for me like sharp.
Installed ionic-native in version 2.9.0 and updated the cordova-screen-orientation-plugin to 2.0.0 and im still getting this error.
TypeError: undefined is not an object (evaluating 'u[e].apply')
unminified:
TypeError: undefined is not an object (evaluating 'pluginInstance[methodName].apply')
I have to add: I installed via npm install [email protected] and manually moved the content of the dist folder to the www/lib/ionic-native folder because the ionic-native-bower project is still outdated and I'm still struggling with the old, at least for me confusing, project structure of ionic with the node_module and www/lib by bower mixup.
EDIT:
Added a minimal example with the bug and step by step setup:
https://github.com/MaxDaten/ionic-native-screen-orientation-bug
Switching cordova-plugin-screen-orientation to version 1.4.3 solved the problem.
> ionic plugin rm cordova-plugin-screen-orientation --save
> ionic plugin add [email protected] --save
Is it a bug with ionic-native or cordova-plugin-screen-orientation?
This works for me, putting the logic into the initializeApp function makes sense since it is essential for this particular functionality to properly trigger. So inside of app.module.ts I have:
constructor(
public platform: Platform,
public statusBar: StatusBar,
public splashScreen: SplashScreen,
private screenOrientation: ScreenOrientation) {
this.initializeApp();
// used for an example of ngFor and navigation
this.pages = [
{ title: 'Home', component: HomePage },
{ title: 'List', component: ListPage }
];
}
initializeApp() {
this.platform.ready().then(() => {
// Okay, so the platform is ready and our plugins are available.
// Here you can do any higher level native things you might need.
this.statusBar.styleDefault();
this.splashScreen.hide();
// lock the screen orientation
this.screenOrientation
.lock(this.screenOrientation.ORIENTATIONS.PORTRAIT)
.then(status => console.log(status))
.catch (e => console.log(e));
});
}
My current version
ionic -v
3.20.0
it would have been great to document the versions of the plugins or a copy of config section. is it screenOrientation4 or is it beta or 5. I have the same code as the guy Adyngom and it doesnt work. https://ionicframework.com/docs/native/screen-orientation I did evrything thats said here except I dont import beta ngx version. It works perfect with emulator -lc but doesnt work on device IOS android
Most helpful comment
Switching
cordova-plugin-screen-orientationto version 1.4.3 solved the problem.Is it a bug with
ionic-nativeorcordova-plugin-screen-orientation?