You can override the platform in your Flutter widget tests by setting
debugDefaultTargetPlatformOverride before pumping your widget.

Platform.isAndroid / Platform.isIOS comes from dart:io, but Flutter widgets use Theme.of(context).platform (or defaultTargetPlatform) internally — so for UI branching, you should rely on defaultTargetPlatform instead of Platform.isAndroid to make testing easier.

Example:

Your widget:

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';

class PlatformWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    if (defaultTargetPlatform == TargetPlatform.android) {
      return WidgetAndroid();
    } else if (defaultTargetPlatform == TargetPlatform.iOS) {
      return WidgetIOS();
    }
    return SizedBox();
  }
}
class WidgetAndroid extends StatelessWidget {
  @override
  Widget build(BuildContext context) => Text('Android Widget');
}
class WidgetIOS extends StatelessWidget {
  @override
  Widget build(BuildContext context) => Text('iOS Widget');
}

Widget test:

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';

void main() {
  tearDown(() {
    // Always reset after test to avoid leaking platform state
    debugDefaultTargetPlatformOverride = null;
  });

  testWidgets('Shows Android widget on Android', (WidgetTester tester) async {
    debugDefaultTargetPlatformOverride = TargetPlatform.android;

    await tester.pumpWidget(MaterialApp(home: PlatformWidget()));

    expect(find.byType(WidgetAndroid), findsOneWidget);
    expect(find.byType(WidgetIOS), findsNothing);
  });

  testWidgets('Shows iOS widget on iOS', (WidgetTester tester) async {
    debugDefaultTargetPlatformOverride = TargetPlatform.iOS;

    await tester.pumpWidget(MaterialApp(home: PlatformWidget()));

    expect(find.byType(WidgetIOS), findsOneWidget);
    expect(find.byType(WidgetAndroid), findsNothing);
  });
}

Key Points:

  • Use defaultTargetPlatform instead of Platform.isAndroid for widgets – it’s easier to override in tests.
  • In tests, set debugDefaultTargetPlatformOverride = TargetPlatform.android (or iOS) before pumping the widget.
  • Call debugDefaultTargetPlatformOverride = null; in tearDown() so one test’s platform setting doesn’t affect others.
  • If you must use Platform.isAndroid for native API calls, keep UI branching on defaultTargetPlatform for testability.

This way, your widget test can easily simulate Android or iOS without running on those devices.

Need Help With Flutter Development?

Work with our skilled Flutter developers to accelerate your project and boost its performance.

Hire Flutter Developers

Support On Demand!

Related Q&A