Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 51 additions & 5 deletions lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -19,21 +19,54 @@ void main() {
///
/// Configure both keys in a local, gitignored `.env` file at the project
/// root (see `.env.example`).
class LocalyticsSampleApp extends StatelessWidget {
ThemeData _appTheme(Brightness brightness) {
return ThemeData(
useMaterial3: true,
colorSchemeSeed: Colors.indigo,
brightness: brightness,
);
}

class LocalyticsSampleApp extends StatefulWidget {
const LocalyticsSampleApp({super.key});

@override
State<LocalyticsSampleApp> createState() => _LocalyticsSampleAppState();
}

class _LocalyticsSampleAppState extends State<LocalyticsSampleApp> {
ThemeMode _themeMode = ThemeMode.light;

void _toggleThemeMode() {
setState(() {
_themeMode =
_themeMode == ThemeMode.light ? ThemeMode.dark : ThemeMode.light;
});
}

@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Localytics Flutter Sample',
theme: ThemeData(useMaterial3: true, colorSchemeSeed: Colors.indigo),
home: const _HomePage(),
theme: _appTheme(Brightness.light),
darkTheme: _appTheme(Brightness.dark),
themeMode: _themeMode,
home: _HomePage(
isDarkMode: _themeMode == ThemeMode.dark,
onToggleThemeMode: _toggleThemeMode,
),
);
}
}

class _HomePage extends StatefulWidget {
const _HomePage();
const _HomePage({
required this.isDarkMode,
required this.onToggleThemeMode,
});

final bool isDarkMode;
final VoidCallback onToggleThemeMode;

@override
State<_HomePage> createState() => _HomePageState();
Expand Down Expand Up @@ -125,7 +158,20 @@ class _HomePageState extends State<_HomePage> {
Widget build(BuildContext context) {
final theme = Theme.of(context);
return Scaffold(
appBar: AppBar(title: const Text('Localytics Flutter Sample')),
appBar: AppBar(
title: const Text('Localytics Flutter Sample'),
actions: <Widget>[
IconButton(
tooltip: widget.isDarkMode
? 'Switch to light mode'
: 'Switch to dark mode',
onPressed: widget.onToggleThemeMode,
icon: Icon(
widget.isDarkMode ? Icons.light_mode : Icons.dark_mode,
),
),
],
),
body: ListView(
padding: const EdgeInsets.all(16),
children: <Widget>[
Expand Down
30 changes: 30 additions & 0 deletions test/widget_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

import 'dart:ui';

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

import 'package:localytics_flutter_tester/main.dart';
Expand All @@ -27,6 +28,7 @@ void main() {

expect(find.text('Localytics Flutter Sample'), findsOneWidget);
expect(find.text('Diagnostics'), findsOneWidget);
expect(find.byTooltip('Switch to dark mode'), findsOneWidget);

for (final String section in <String>[
'Privacy',
Expand All @@ -45,4 +47,32 @@ void main() {
);
}
});

testWidgets('theme toggle switches between light and dark mode',
(WidgetTester tester) async {
await tester.pumpWidget(const LocalyticsSampleApp());
await tester.pumpAndSettle();

final Finder darkModeButton = find.byTooltip('Switch to dark mode');
expect(darkModeButton, findsOneWidget);

final MaterialApp materialAppBefore =
tester.widget<MaterialApp>(find.byType(MaterialApp));
expect(materialAppBefore.themeMode, ThemeMode.light);

await tester.tap(darkModeButton);
await tester.pumpAndSettle();

final MaterialApp materialAppAfter =
tester.widget<MaterialApp>(find.byType(MaterialApp));
expect(materialAppAfter.themeMode, ThemeMode.dark);
expect(find.byTooltip('Switch to light mode'), findsOneWidget);

await tester.tap(find.byTooltip('Switch to light mode'));
await tester.pumpAndSettle();

final MaterialApp materialAppRestored =
tester.widget<MaterialApp>(find.byType(MaterialApp));
expect(materialAppRestored.themeMode, ThemeMode.light);
});
}