<

ウィンドウシングルトンは非推奨になりました

まとめ

複数のビューと複数のウィンドウをサポートする準備として、windowシングルトンは非推奨になりました。以前に依存していたコードwindowシングルトン 操作したい特定のビューを、View.ofAPI または、PlatformDispatcher直接。

コンテクスト

当初、Flutter はアプリケーションが単一のコンポーネントのみで構成されることを想定していました。 ビュー (window) コンテンツを引き込むことができます。マルチビューの世界では、これは 仮定はもはや意味をなさず、この仮定をエンコードする API には 廃止されました。代わりに、これらの API に依存するアプリケーションとライブラリ 操作したい特定のビューを選択する必要があります。 この移行ガイドで説明されているように、新しいマルチビュー互換 API に移行してください。

変更内容の説明

この変更の一環として非推奨となった API は次のとおりです。

  • グローバルwindowによって公開された財産dart:ui
  • windowのプロパティBaseBindingクラス、 通常は次の方法でアクセスします。
    • GestureBinding.instance.window
    • SchedulerBinding.instance.window
    • ServicesBinding.instance.window
    • PaintingBinding.instance.window
    • SemanticsBinding.instance.window
    • RendererBinding.instance.window
    • WidgetsBinding.instance.window、 また
    • WidgetTester.binding.window
  • の90cf395f-1c25-4ベッド-80ad-bd507a121399からのクラスdart:ui
  • TestWindowからflutter_test、そのコンストラクター、 およびそのすべてのプロパティとメソッド。

依存するアプリケーションおよびライブラリ コードを移行するには、次のオプションがあります。 これらの非推奨の API については、次のとおりです。

もしBuildContextが利用可能です。現在の情報を調べることを検討してください。FlutterView経由View.of。これにより返されるのは、FlutterViewの中へ によって構築されたウィジェットbuild指定されたコンテキストに関連付けられたメソッド 描かれます。のFlutterView同じ機能へのアクセスを提供します 以前は非推奨になったバージョンで利用可能でしたSingletonFlutterViewクラス 非推奨によって返されるwindow上記のプロパティ。ただし、一部の プラットフォーム固有の機能は、PlatformDispatcher、 からアクセスできますFlutterViewによって返されましたView.of経由FlutterView.platformDispatcher。使用するView.ofの好ましい方法です 上記の非推奨のプロパティから移行します。

いいえの場合BuildContextを検索することができますFlutterViewPlatformDispatcher直接参照してプラットフォーム固有の情報にアクセスできます 機能性。また、利用可能なすべてのリストも維持しますFlutterViewにいるPlatformDispatcher.viewsビュー固有の機能にアクセスします。もし可能なら、 のPlatformDispatcherバインディング経由でアクセスする必要があります (たとえば、WidgetsBinding.instance.platformDispatcher) 静的を使用する代わりにPlatformDispatcher.instance財産。これにより、機能が保証されます。 のPlatformDispatcherテストで適切にモックアウトできます。

テスト

にアクセスしたテストの場合、WidgetTester.binding.window変更するプロパティ テスト用のウィンドウ プロパティでは、次の移行が利用可能です。

で書かれたテストではtestWidgets、2 つの新しいプロパティが追加されました。 ~の機能を一緒に置き換えるTestWindow

  • WidgetTester.viewを提供しますTestFlutterView変更できるもの 同様にWidgetTester.binding.window、ただしビュー固有のみ ビューのサイズ、表示ピクセル比などのプロパティ。
    • WidgetTester.viewOf特定のマルチビューのユースケースでは利用できますが、 からの移行には必要ありません。WidgetTester.binding.window
  • WidgetTester.platformDispatcherへのアクセスを提供しますTestPlatformDispatcherプラットフォーム固有の変更に使用できます プラットフォームのロケール、特定のシステム機能かどうかなどのプロパティ などが利用可能です。

移行ガイド

静的ファイルにアクセスする代わりに、windowプロパティ、アプリケーション、およびライブラリ コード にアクセスできるBuildContext使用する必要がありますView.of調べるためにFlutterViewコンテキストが関連付けられています。一部の物件はこちらに移転しました のPlatformDispatcherビューからアクセス可能platformDispatcherゲッター。

移行前のコード:

Widget build(BuildContext context) {
  final double dpr = WidgetsBinding.instance.window.devicePixelRatio;
  final Locale locale = WidgetsBinding.instance.window.locale;
  return Text('The device pixel ratio is $pdr and the locale is $locale.');
}

移行後のコード:

Widget build(BuildContext context) {
  final double dpr = View.of(context).devicePixelRatio;
  final Locale locale = View.of(context).platformDispatcher.locale;
  return Text('The device pixel ratio is $pdr and the locale is $locale.');
}

いいえの場合BuildContext利用可能です。PlatformDispatcherによって暴露された バインディングを直接参照できます。

移行前のコード:

double getTextScaleFactor() {
  return WidgetsBinding.instance.window.textScaleFactor;
}

移行後のコード:

double getTextScaleFactor() {
  // View.of(context).platformDispatcher.textScaleFactor if a BuildContext is available, otherwise:
  return WidgetsBinding.instance.platformDispatcher.textScaleFactor;
}

テスト

で書かれたテストではtestWidget、 新しいviewplatformDispatcher代わりにアクセサを使用する必要があります。

ビュー固有のプロパティの設定

TestFlutterViewテスト API をより明確にするための努力も行っています。 代わりに、関連するゲッターと同じ名前のセッターを使用して簡潔にします。 セッターとTestValueサフィックス。

移行前のコード:

testWidget('test name', (WidgetTester tester) async {
  tester.binding.window.devicePixelRatioTestValue = 2.0;
  tester.binding.window.displayFeaturesTestValue = <DisplayFeatures>[];
  tester.binding.window.gestureSettingsTestValue = const GestureSettings(physicalTouchSlop: 100);
  tester.binding.window.paddingTestValue = FakeViewPadding.zero;
  tester.binding.window.physicalGeometryTestValue = const Rect.fromLTRB(0,0, 500, 800);
  tester.binding.window.physicalSizeTestValue = const Size(300, 400);
  tester.binding.window.systemGestureInsetsTestValue = FakeViewPadding.zero;
  tester.binding.window.viewInsetsTestValue = FakeViewPadding.zero;
  tester.binding.window.viewPaddingTestValue = FakeViewPadding.zero;
});

移行後のコード

testWidget('test name', (WidgetTester tester) async {
  tester.view.devicePixelRatio = 2.0;
  tester.view.displayFeatures = <DisplayFeatures>[];
  tester.view.gestureSettings = const GestureSettings(physicalTouchSlop: 100);
  tester.view.padding = FakeViewPadding.zero;
  tester.view.physicalGeometry = const Rect.fromLTRB(0,0, 500, 800);
  tester.view.physicalSize = const Size(300, 400);
  tester.view.systemGestureInsets = FakeViewPadding.zero;
  tester.view.viewInsets = FakeViewPadding.zero;
  tester.view.viewPadding = FakeViewPadding.zero;
});

ビュー固有のプロパティのリセット

TestFlutterView個々のプロパティまたは 全体像ですが、より明確かつ一貫性のあるものにするために、これらの名前を付けています。 からメソッドが変更されましたclear<property>TestValueclearAllTestValuesreset<property>resetそれぞれ。

個々のプロパティのリセット

移行前のコード:

testWidget('test name', (WidgetTester tester) async {
  addTearDown(tester.binding.window.clearDevicePixelRatioTestValue);
  addTearDown(tester.binding.window.clearDisplayFeaturesTestValue);
  addTearDown(tester.binding.window.clearGestureSettingsTestValue);
  addTearDown(tester.binding.window.clearPaddingTestValue);
  addTearDown(tester.binding.window.clearPhysicalGeometryTestValue);
  addTearDown(tester.binding.window.clearPhysicalSizeTestValue);
  addTearDown(tester.binding.window.clearSystemGestureInsetsTestValue);
  addTearDown(tester.binding.window.clearViewInsetsTestValue);
  addTearDown(tester.binding.window.clearViewPaddingTestValue);
});

移行後のコード

testWidget('test name', (WidgetTester tester) async {
  addTearDown(tester.view.resetDevicePixelRatio);
  addTearDown(tester.view.resetDisplayFeatures);
  addTearDown(tester.view.resetGestureSettings);
  addTearDown(tester.view.resetPadding);
  addTearDown(tester.view.resetPhysicalGeometry);
  addTearDown(tester.view.resetPhysicalSize);
  addTearDown(tester.view.resetSystemGestureInsets);
  addTearDown(tester.view.resetViewInsets);
  addTearDown(tester.view.resetViewPadding);
});
すべてのプロパティを一度にリセットする

移行前のコード:

testWidget('test name', (WidgetTester tester) async {
  addTearDown(tester.binding.window.clearAllTestValues);
});

移行後のコード

testWidget('test name', (WidgetTester tester) async {
  addTearDown(tester.view.reset);
});

プラットフォーム固有のプロパティの設定

TestPlatformDispatcher同じ機能と命名スキームを保持します。 テストセッターもそうでしたTestWindowしたがって、プラットフォーム固有のプロパティの移行 主に、新しいセッターで同じセッターを呼び出すことで構成されます。WidgetTester.platformDispatcherアクセサ。

移行前のコード:

testWidgets('test name', (WidgetTester tester) async {
  tester.binding.window.accessibilityFeaturesTestValue = FakeAccessibilityFeatures.allOn;
  tester.binding.window.alwaysUse24HourFormatTestValue = false;
  tester.binding.window.brieflyShowPasswordTestValue = true;
  tester.binding.window.defaultRouteNameTestValue = '/test';
  tester.binding.window.initialLifecycleStateTestValue = 'painting';
  tester.binding.window.localesTestValue = <Locale>[const Locale('en-us'), const Locale('ar-jo')];
  tester.binding.window.localeTestValue = const Locale('ar-jo');
  tester.binding.window.nativeSpellCheckServiceDefinedTestValue = false;
  tester.binding.window.platformBrightnessTestValue = Brightness.dark;
  tester.binding.window.semanticsEnabledTestValue = true;
  tester.binding.window.textScaleFactorTestValue = 2.0;
});

移行後のコード:

testWidgets('test name', (WidgetTester tester) async {
  tester.platformDispatcher.accessibilityFeaturesTestValue = FakeAccessibilityFeatures.allOn;
  tester.platformDispatcher.alwaysUse24HourFormatTestValue = false;
  tester.platformDispatcher.brieflyShowPasswordTestValue = true;
  tester.platformDispatcher.defaultRouteNameTestValue = '/test';
  tester.platformDispatcher.initialLifecycleStateTestValue = 'painting';
  tester.platformDispatcher.localesTestValue = <Locale>[const Locale('en-us'), const Locale('ar-jo')];
  tester.platformDispatcher.localeTestValue = const Locale('ar-jo');
  tester.platformDispatcher.nativeSpellCheckServiceDefinedTestValue = false;
  tester.platformDispatcher.platformBrightnessTestValue = Brightness.dark;
  tester.platformDispatcher.semanticsEnabledTestValue = true;
  tester.platformDispatcher.textScaleFactorTestValue = 2.0;
});

プラットフォーム固有のプロパティのリセット

プロパティの設定と同様に、プラットフォーム固有のプロパティのリセットは次のようになります。 主に、からの変更binding.windowへのアクセサplatformDispatcherアクセサ。

個々のプロパティのリセット

移行前のコード:

testWidgets('test name', (WidgetTester tester) async {
  addTeardown(tester.binding.window.clearAccessibilityFeaturesTestValue);
  addTeardown(tester.binding.window.clearAlwaysUse24HourFormatTestValue);
  addTeardown(tester.binding.window.clearBrieflyShowPasswordTestValue);
  addTeardown(tester.binding.window.clearDefaultRouteNameTestValue);
  addTeardown(tester.binding.window.clearInitialLifecycleStateTestValue);
  addTeardown(tester.binding.window.clearLocalesTestValue);
  addTeardown(tester.binding.window.clearLocaleTestValue);
  addTeardown(tester.binding.window.clearNativeSpellCheckServiceDefinedTestValue);
  addTeardown(tester.binding.window.clearPlatformBrightnessTestValue);
  addTeardown(tester.binding.window.clearSemanticsEnabledTestValue);
  addTeardown(tester.binding.window.clearTextScaleFactorTestValue);
});

移行後のコード:

testWidgets('test name', (WidgetTester tester) async {
  addTeardown(tester.platformDispatcher.clearAccessibilityFeaturesTestValue);
  addTeardown(tester.platformDispatcher.clearAlwaysUse24HourFormatTestValue);
  addTeardown(tester.platformDispatcher.clearBrieflyShowPasswordTestValue);
  addTeardown(tester.platformDispatcher.clearDefaultRouteNameTestValue);
  addTeardown(tester.platformDispatcher.clearInitialLifecycleStateTestValue);
  addTeardown(tester.platformDispatcher.clearLocalesTestValue);
  addTeardown(tester.platformDispatcher.clearLocaleTestValue);
  addTeardown(tester.platformDispatcher.clearNativeSpellCheckServiceDefinedTestValue);
  addTeardown(tester.platformDispatcher.clearPlatformBrightnessTestValue);
  addTeardown(tester.platformDispatcher.clearSemanticsEnabledTestValue);
  addTeardown(tester.platformDispatcher.clearTextScaleFactorTestValue);
});
すべてのプロパティを一度にリセットする

移行前のコード:

testWidgets('test name', (WidgetTester tester) async {
  addTeardown(tester.binding.window.clearAllTestValues);
});

移行後のコード:

testWidgets('test name', (WidgetTester tester) async {
  addTeardown(tester.platformDispatcher.clearAllTestValues);
});

タイムライン

リリースされたバージョン: 3.9.0-13.0.pre.20
安定リリース: 3.10.0

参考文献

API ドキュメント:

  • View.of
  • FlutterView
  • PlatformDispatcher
  • TestPlatformDispatcher
  • TestFlutterView
  • TestWidgetsFlutterBinding.window

関連する問題:

  • 問題 116929
  • 問題 117481
  • 問題 121915

関連する PR:

  • SingletonFlutterWindow とグローバル ウィンドウ シングルトンを非推奨にする
  • BindingBase.window を非推奨にする
  • 廃止予定TestWindow
b8f425a6-アッベ-4b99-a984-6d67131c6491