autoshot 1.1.2
autoshot: ^1.1.2 copied to clipboard
Automate App Store and Play Store screenshot generation across multiple devices, locales, and screens. Runs in Flutter Web and outputs a ZIP archive.
example/lib/main.dart
import 'package:autoshot/autoshot.dart';
import 'package:flutter/material.dart';
final GlobalKey<NavigatorState> appNavigatorKey = GlobalKey<NavigatorState>();
void main() {
runApp(
Autoshot(
config: AutoshotConfig(
screens: [
ScreenEntry.route(
name: 'home',
navigate: (_) async {
appNavigatorKey.currentState?.pushNamedAndRemoveUntil(
'/home',
(route) => false,
);
},
),
ScreenEntry.route(
name: 'detail',
navigate: (_) async {
appNavigatorKey.currentState?.pushNamedAndRemoveUntil(
'/detail',
(route) => false,
);
},
),
],
locales: const [Locale('en', 'US')],
devices: [Devices.ios.iPhone13ProMax],
theme: ThemeData(colorSchemeSeed: Colors.indigo, useMaterial3: true),
darkTheme: ThemeData(
colorSchemeSeed: Colors.indigo,
brightness: Brightness.dark,
useMaterial3: true,
),
),
builder: (context) => MyApp(navigatorKey: appNavigatorKey),
),
);
}
class MyApp extends StatelessWidget {
const MyApp({super.key, required this.navigatorKey});
final GlobalKey<NavigatorState> navigatorKey;
@override
Widget build(BuildContext context) {
return MaterialApp(
navigatorKey: navigatorKey,
// ignore: deprecated_member_use
useInheritedMediaQuery: true,
locale: DevicePreview.locale(context),
builder: DevicePreview.appBuilder,
theme: ThemeData(colorSchemeSeed: Colors.indigo, useMaterial3: true),
darkTheme: ThemeData(
colorSchemeSeed: Colors.indigo,
brightness: Brightness.dark,
useMaterial3: true,
),
debugShowCheckedModeBanner: false,
initialRoute: '/home',
routes: {
'/home': (_) => const HomeScreen(),
'/detail': (_) => const DetailScreen(),
},
);
}
}
class HomeScreen extends StatelessWidget {
const HomeScreen({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Home')),
body: ListView.builder(
itemCount: 20,
itemBuilder: (context, index) => ListTile(
leading: CircleAvatar(child: Text('${index + 1}')),
title: Text('Item ${index + 1}'),
subtitle: const Text('Tap to see details'),
onTap: () {},
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {},
child: const Icon(Icons.add),
),
);
}
}
class DetailScreen extends StatelessWidget {
const DetailScreen({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Detail')),
body: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Icon(
Icons.photo_library_rounded,
size: 80,
color: Theme.of(context).colorScheme.primary,
),
const SizedBox(height: 24),
Text(
'Beautiful Detail View',
style: Theme.of(context).textTheme.headlineMedium,
),
const SizedBox(height: 8),
Text(
'This screen is captured for every device and locale.',
style: Theme.of(context).textTheme.bodyMedium,
),
],
),
),
);
}
}