使用平台分支进行 Flutter 小部件测试

S.D*_*.D. 16 flutter

在我的小部件代码中,我需要在 Android/iOS 上进行分支,以显示特定于每个平台的小部件,并调用特定于平台的 API(例如,Android 小部件将调用仅在 Android 上可用的 API)。

  if (Platform.isAndroid) {
    return WidgetAndroid(...);
  } else if (Platform.isIOS) {
    return WidgetIOS(...);
  }
Run Code Online (Sandbox Code Playgroud)

如何使用 Flutter 小部件测试来测试是否显示正确的小部件?

我知道我可以检查该小部件是否存在,但如何在特定平台上运行测试。

expect(find.byType(WidgetIOS), findsOneWidget);
Run Code Online (Sandbox Code Playgroud)

Max*_*lin 27

2022年不建议使用dart:ioand Platformclass来确定运行平台。更好的选择是defaultTargetPlatform通过“package:flutter/foundation.dart”使用可用的。IE:

if (defaultTargetPlatform == TargetPlatform.android ||
            defaultTargetPlatform == TargetPlatform.iOS) {}
Run Code Online (Sandbox Code Playgroud)

如果您有这种方法来确定代码中的平台覆盖测试中的平台,那么就像debugDefaultTargetPlatformOverride在测试主体中设置一样简单。

https://api.flutter.dev/flutter/foundation/debugDefaultTargetPlatformOverride.html

例如:

  testWidgets('DataTable2 renders with DataRow.index()',
      (WidgetTester tester) async {
    debugDefaultTargetPlatformOverride = TargetPlatform.android;
 ...
    debugDefaultTargetPlatformOverride = null;
  });
Run Code Online (Sandbox Code Playgroud)


Mig*_*ran 11

运行时和Platform.isAndroid返回Platform.isIOSfalsetestWidgets

我们可以在测试中应用一些建议:

  • 将平台作为变量传递给您的顶级小部件,这样您就可以手动提供该值。
  • 将您想要测试的情况设置为elsewithout if,以便在测试期间运行。
  • 使用https://pub.dev/packages/platformPlatform来代替,它允许模拟,这可能是最好的长期解决方案。