import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'dart:async'; abstract class MaterialAppWithIntro extends StatelessWidget { final String name; final ThemeData theme; final Map routes; final WidgetBuilder introWidget; final WidgetBuilder continueWidget; final String prefsKey; MaterialAppWithIntro(this.name, this.theme, this.routes, this.introWidget, this.continueWidget, this.prefsKey); @override Widget build(BuildContext context) { return MaterialApp( home: MaterialAppWithIntroHome(introWidget, continueWidget, prefsKey), title: name, theme: theme, routes: routes, ); } } class MaterialAppWithIntroHome extends StatefulWidget { final WidgetBuilder introWidget; final WidgetBuilder continueWidget; final String prefsKey; const MaterialAppWithIntroHome( this.introWidget, this.continueWidget, this.prefsKey); @override _MaterialAppWithIntroState createState() => _MaterialAppWithIntroState(introWidget, continueWidget, prefsKey); } class _MaterialAppWithIntroState extends State { final WidgetBuilder introWidget; final WidgetBuilder continueWidget; final String prefsKey; _MaterialAppWithIntroState( this.introWidget, this.continueWidget, this.prefsKey); @override void initState() { super.initState(); Timer(const Duration(milliseconds: 1000), () { checkFirstStart(); }); } // https://stackoverflow.com/questions/50654195/flutter-one-time-intro-screen Future checkFirstStart() async { final String initialWizardKey = prefsKey; final SharedPreferences prefs = await SharedPreferences.getInstance(); final bool showInitialWizard = (prefs.getBool(initialWizardKey) ?? true); if (showInitialWizard) { await prefs.setBool(initialWizardKey, false); if (mounted) { await Navigator.of(context) .pushReplacement(MaterialPageRoute(builder: introWidget)); } } else { if (mounted) { await Navigator.of(context) .pushReplacement(MaterialPageRoute(builder: continueWidget)); } } } @override Widget build(BuildContext context) { return Scaffold( body: Center( child: CircularProgressIndicator(), ), ); } }