反応しないときに切り分ける
最初に、症状を1つ選ぶ
Section titled “最初に、症状を1つ選ぶ”このページは、エラーが出ないのに期待どおりに動かないときの切り分け手順です。症状ごとに、FloatSoda の制約によるものか、書き間違いかを分けて直します。
最初に、次の 2 点を確かめてください。
- 動かしている窓の種類(
DashboardWindow、WorldSpaceWindow、DeviceTrackedWindow) - コンソールのログに、エラーや警告が出ていないか
ログに例外やエラーが出ているときは、このページではなく エラーを読んで直す へ進みます。出ていなければ、症状に合う節を選びます。
| 症状 | 進む先 |
|---|---|
| ボタンを押しても何も起きない | ボタンを押しても反応しない |
| 値は変わっているのに、数字や文字が変わらない | 数字や文字が変わらない |
| 文字や画像が出ない | 文字や画像が出ない |
| 中身が変わっても、窓の大きさが変わらない | 表示の大きさが更新されない |
WorldSpaceWindow や DeviceTrackedWindow で押せない |
ほかの種類のオーバーレイで試した場合 |
ボタンを押しても反応しない
Section titled “ボタンを押しても反応しない”押しても何も起きないときは、次の順に確かめます。
- 窓の種類が
DashboardWindowであることを確かめる - 押す範囲に、ヒットテストに応じる子があることを確かめる
- 上に重なって入力を塞ぐウィジェットがないことを確かめる
OnTapが、離した時点で呼ばれる前提で動いていることを確かめる
各項目の理由は次のとおりです。
- 窓の種類: ポインタの座標が届くのは
DashboardWindowだけです。WorldSpaceWindowとDeviceTrackedWindowでは、GestureDetectorのコールバックが呼ばれません(追跡: #182)。デスクトップの窓で反応しても、ダッシュボードで反応する証明にはなりません。 - 押す範囲:
Behaviourの既定はHitTestBehaviour.DeferToChildで、子が押された位置を受け取れる範囲でだけ反応します。ColoredBoxとTextは自分の範囲全体で受け取りますが、PaddingやSizedBoxの余白は受け取りません。空白を含む領域全体で反応させるには、Behaviour = HitTestBehaviour.Opaqueを指定します。 - 重なり:
Stackなどで重ねたウィジェットの上側に、AbsorbPointerやOpaqueのGestureDetectorがあると、下側に入力が届きません。入力を素通りさせたい上側のウィジェットは、IgnorePointerで包みます。 OnTap: 押した時点ではなく、離した時点でタップが成立して呼ばれます。押したまま 18 ピクセル(GestureConstants.TouchSlop)を超えて動かすと、タップは成立せず、OnTapは呼ばれません。そのときOnPanUpdateなどを指定していれば、ドラッグとして扱われます。
new GestureDetector{ Behaviour = HitTestBehaviour.Opaque, OnTap = () => SetState(() => _count++), Child = new ColoredBox { Color = SKColors.CornflowerBlue, Child = new SizedBox { Width = 220, Height = 64 }, },}Button などの UI コンポーネントは、まだ提供していません(追跡: #126)。ボタンは GestureDetector で組み立てます(組み立て方は ボタンやトグルを組み立てる)。
できた? ボタンを押すと反応する。
できなかったら
ダッシュボード以外で押したい場合は、直せません。ポインタ座標の接続が未対応の制約です(追跡: #182)。操作が要る画面を DashboardWindow に置いてください。ほかの制約は、リファレンスの できないこと・まだ使えないもの にあります。
上の 4 点を確かめて必要な修正をしても反応しないときは、それでも直らないとき へ進みます。
数字や文字が変わらない
Section titled “数字や文字が変わらない”値は変わっているのに画面が変わらないときは、まず、値を書き換えるときに SetState() を使っているかを確かめます。ウィジェットは、作り直されて初めて新しい値を画面に反映します。SetState() は、値の書き換えと作り直しの依頼を一度に行います。
確かめ方は、値を書き換えている行を探すことです。State のフィールドを _count++ のように直接書き換えているだけなら、画面は変わりません。その行を SetState() の中に入れます。
// 画面が変わらない書き方_count++;
// 画面が変わる書き方SetState(() => _count++);仕組みの詳細は 状態と作り直し にあります。
できた? 値が変わると画面が変わる。
できなかったら
SetState() を呼んでいるのに変わらないときは、値を書き換えた先が、画面に表示している値と同じ場所かを確かめます。ウィジェットは、作り直しで新しいインスタンスに置き換わることがあり、そのときウィジェットのフィールドに持たせた値は引き継がれません。変わる値は State に持たせます。それでも変わらないときは、それでも直らないとき へ進みます。
文字や画像が出ない
Section titled “文字や画像が出ない”文字や画像が出ないときは、次の順に確かめます。
- 文字の色が背景と同じではないか。
Textの既定の色は黒です(TextStyleのColorを省略したとき)。背景も暗い色だと、文字が見えません。Colorを明るい色にして試します。 - 文字の大きさが小さすぎないか。
TextStyleのFontSizeの既定は 30 です。0 以下の値を入れると、描かれないのではなくArgumentOutOfRangeExceptionが出ます。 - ウィンドウの
Titleが重複していないか。 同じTitleで 2 つのウィンドウを作ると、後から作ったウィンドウは描画されません。Titleはウィンドウごとに別の値にします。 - 画像は、読み込みが終わるまで何も出ないことを踏まえているか。
Imageの読み込みは非同期です。LoadingBuilderとErrorBuilderを指定しなければ、読み込み中も、読み込みに失敗したときも、何も表示されません。失敗してもアプリは停止しません。ErrorBuilderを指定すると、失敗に気づけます。 - 画像とアイコンに、
FloatSoda.Widgets.Paint名前空間のImageとIconを使っているか。 画像はImageにFileImageProviderを渡して表示します。
ErrorBuilder には、エラーを受け取ってウィジェットを返す関数(Func<IBuildContext, Exception, Widget>)を渡します。次の例は、読み込みに失敗したときに、エラーの文を Text で出します。
new Image{ Provider = new FileImageProvider("photo.png"), ErrorBuilder = (context, error) => new Text($"読み込めません: {error.Message}"),}できた? 文字や画像が出る。
できなかったら
色、大きさ、Title の重複、画像の読み込みの 4 つが当てはまらないときは、それでも直らないとき へ進みます。文字の色や大きさの指定方法は 見た目を整える にあります。
表示の大きさが更新されない
Section titled “表示の大きさが更新されない”起動後に中身の大きさが変わっても、SteamVR 上の窓の大きさが最初のままのときは、まず Size を省略していないかを確かめます。Size を省略したウィンドウは、最初のレイアウト結果の大きさで表示され、その後に中身が大きくなっても更新されません(追跡: #285)。
中身の大きさが変わるウィンドウには、Size を指定します。
app.CreateWindow(new DashboardWindow{ Title = "MyDashboard", Size = new SKSize(600, 400), Child = root,});大きさの決まり方の詳細は、レイアウトの考え方 にあります。
できた? 表示の大きさが指定どおりになる。
できなかったら
Size を指定しても大きさが変わらないときは、ダッシュボードのオーバーレイの大きさを SteamVR が管理していることが原因の可能性があります。その場合は、オーバーレイの種類と選び方 で DashboardWindow の大きさの扱いを確かめます。それでも直らないときは、それでも直らないとき へ進みます。
ほかの種類のオーバーレイで試した場合
Section titled “ほかの種類のオーバーレイで試した場合”WorldSpaceWindow や DeviceTrackedWindow で押せないのは、書き間違いではなく制約です。この 2 種類では、ポインタの座標を使うウィジェット(GestureDetector など)が動きません(追跡: #182)。コントローラーのボタンで操作するなら、アクション入力を使えます。操作が要る画面は DashboardWindow に置き、ダッシュボードに替えて試してください。3 種類の違いは オーバーレイの種類と選び方 にあります。
それでも直らないとき
Section titled “それでも直らないとき”直らないときの行き先は、ガイドの docs で見つからないとき にあります。聞くときは、次の情報を添えると、原因を絞りやすくなります。
- 症状(何をしたら、何が起きなかったか)
- 窓の種類(
DashboardWindowなど) - 再現するコード(貼り付けるだけで動く最小のもの)
- FloatSoda のバージョン