コルネの進捗や備忘録が記されたなにか

進捗や成果物や備忘録てきななにかを雑に更新していきます。

Power Apps のApp オブジェクトにStartScreen プロパティが追加されました


スポンサードリンク

はじめに

Power Apps のApp オブジェクトにStartScreen プロパティが追加されました。

f:id:koruneko:20211021192834p:plain

公式docs には現在英語のドキュメントにしかStartScreen プロパティに関する記載がないので英語のドキュメントを確認しましょう。

docs.microsoft.com

StartScreen プロパティを使うとなにができるの?

アプリ起動時に最初に表示する画面を定義することができます。

従来はツリービューの先頭に設定してある画面がアプリ起動時に最初に表示される画面でしたが、StartScreen プロパティに画面のオブジェクトを設定することで、設定した画面が最初に表示されます。

このプロパティのデフォルト値は空であり、空の場合は従来同様ツリービューの先頭に設定してある画面が表示されます。

使用方法

基本形

App の StartScreen にScreen のオブジェクトが結果として返されるような式を設定すればよいです。

一番単純なものですと、

App.StartScreen

Screen2

みたいな記載ですね。
この設定を行った後、App の右にある・・・(三点リーダ)を選択して「StartScreen に移動する」を実行してみましょう。

f:id:koruneko:20211021231408p:plain

Screen2 へ遷移したと思います。(Screen2 は事前に作成しておいてください。)

もちろんこの設定はアプリ起動時に読み込まれますので、このアプリを公開してアプリを開いてみるとScreen2 から画面が表示されることになります。

パラメータを渡して起動する

Power Apps で作成されたアプリを開く際にパラメータを指定してアプリを開くことができます。
この時指定されたパラメータは、Param 関数で取得することができます。
詳しい説明は公式docs をご覧ください。

docs.microsoft.com

以下のように使用します。

App.StartScreen

Switch(
    Param("ScreenNum"),
    "1", Screen1,
    "2", Screen2,
    "3", Screen3
)

これで
https://apps.powerapps.com/play/...-...-...?tenantId=...-...-...&ScreenNum=2
のリンクからアプリを開いた場合はScreen2 が開かれます。

リストの値と比較する

リストの値を取得してその値と比較を行うことでパラメータ先を決める方法です。

例えば以下のようにして、アプリを利用するユーザが特定レコードのユーザ列に存在しているか?で遷移先を制御することが可能です。

App.StartScreen

If(User().Email in LookUp(UserLists, Title = "TitleA", Users).Email, Screen2, Screen3)

StartScreen プロパティでできないこと

StartScreen では、動作関数や変数、コレクションを使用することはできません。

動作関数とはNewForm 関数などのことを指します。
もちろんNavigate 関数も含みます。

変数及びコレクションは App.OnStart で宣言されたものも参照することができないので、注意が必要です。
もし、変数の値を利用したい。という場合はその変数に設定予定の式をそのまま App.StartScreen にコピペして、If 関数で判定を行った後、しかるべき画面へ遷移させてあげましょう。

個人的にちょっと不満なこと

不満というより困ったな。といったほうが正確かもです。

Navigate 関数だと第3引数に変数を宣言して、その変数を遷移先の画面に渡すことができました。

docs のサンプルの式を引用すると、以下のような記載方法です。

Navigate( Details, ScreenTransition.Fade, { ID: 12 } )

これで Details という画面では、"ID" という変数が利用でき、"ID" を参照すると"12" という値を得ることが可能でした。

しかし、StartScreen プロパティでは遷移先の画面に変数を渡す。なんて処理はできません。
困った。

現状のこの問題の回避策はぱっと思いつく限りで挙げると2通りあります。

まず、グルーバル変数を使用する方法。

これはStartScreen で画面遷移を行うために記載した条件式と同じものを、OnStart プロパティにも記載して、Set 関数で変数を定義する方法。

これで一応問題は解決できますが、変数がグローバルになってしまいます。
変数のスコープは極力最小にしたい私としてはこの書き方には聊か不満があります。

また、既存処理でNavigate 関数を使って変数を渡しているような処理(App.OnStart 以外で)があった場合、Navigate 関数で渡される変数はコンテキスト変数なので、そこもNavigate 前にSet 関数で変数を宣言するようにして、グローバル変数で統一するように修正が必要です。

もう一つの方法はScreen.OnVisible で特定の条件の場合にコンテキスト変数を設定するようにする方法です。

以下のような設定になります。

App.ScreenStart

If(!IsBlank(Param("ParamMode")), Screen2)

Screen1.Button.OnSelect

Navigate(Screen2, ScreenTransition.None, {mode:"new"})

Screen2.OnVisble

If(
    !IsBlank(Param("ParamMode")) && IsBlank(mode),
    UpdateContext({mode:Param("ParamMode")})
)

Screen1.Button.OnSelect の記載の箇所は他スクリーンから App.ScreenStart へ遷移する際の記載方法の例です。

App.ScreenStart で遷移先の画面のScreen2.OnVisble で App.ScreenStart で画面遷移を行った際の条件であった場合と、Navigate 時に渡す予定の変数が空であった場合に、Navigate 時に渡す予定の変数を初期化するようにしています。

Navigate 時に渡す予定の変数の状態を確認しないで変数を更新してしまうと、Navigate 時に宣言した変数が上書きされてしまうので注意が必要です。

これの問題は、App.ScreenStart で遷移する画面へNavigate 関数で遷移する場合は対象の変数が確実になにかしら宣言される。という条件がある点です。

おわりに

最後に記載した内容は、Twitter とかみている感じあまり困っているような人少なそうな印象だったので割と少数てきな問題なのか。という印象を受けました。

もし同じような問題で困っている人の助けになれば幸いです。

もし記事の中での記載や説明に不備や不足している内容があればコメントで指摘いただけると幸いです。


スポンサードリンク