Flutter One time Intro Screen?

后端 未结 6 1267
无人共我
无人共我 2021-01-30 11:22

I have an intro screen for my app, but it shows every time I open the app, I need to show that for the 1st time only.

How to do that?

//         


        
6条回答
  •  情歌与酒
    2021-01-30 12:19

    If you wish to show the intro screen only for the first time, you will need to save locally that this user has already seen intro.

    For such thing you may use Shared Preference. There is a flutter package for Shared Preference which you can use

    EDITED:

    Please refer to the below complete tested code to understand how to use it:

    import 'dart:async';
    
    import 'package:after_layout/after_layout.dart';
    import 'package:flutter/material.dart';
    import 'package:shared_preferences/shared_preferences.dart';
    
    void main() => runApp(new MyApp());
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return new MaterialApp(
          color: Colors.blue,
          home: new Splash(),
        );
      }
    }
    
    class Splash extends StatefulWidget {
      @override
      SplashState createState() => new SplashState();
    }
    
    class SplashState extends State with AfterLayoutMixin {
      Future checkFirstSeen() async {
        SharedPreferences prefs = await SharedPreferences.getInstance();
        bool _seen = (prefs.getBool('seen') ?? false);
    
        if (_seen) {
          Navigator.of(context).pushReplacement(
              new MaterialPageRoute(builder: (context) => new Home()));
        } else {
          await prefs.setBool('seen', true);
          Navigator.of(context).pushReplacement(
              new MaterialPageRoute(builder: (context) => new IntroScreen()));
        }
      }
    
      @override
      void afterFirstLayout(BuildContext context) => checkFirstSeen();
    
      @override
      Widget build(BuildContext context) {
        return new Scaffold(
          body: new Center(
            child: new Text('Loading...'),
          ),
        );
      }
    }
    
    class Home extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return new Scaffold(
          appBar: new AppBar(
            title: new Text('Hello'),
          ),
          body: new Center(
            child: new Text('This is the second page'),
          ),
        );
      }
    }
    
    class IntroScreen extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return new Scaffold(
          appBar: new AppBar(
            title: new Text('IntroScreen'),
          ),
          body: new Center(
            child: new Text('This is the IntroScreen'),
          ),
        );
      }
    }
    

    Thanks to Ben B for noticing the incorrect use of delay in initState. I had used a delay because sometimes the context is not ready immediately inside initState.

    So now I have replaced that with afterFirstLayout which is ready with the context. You will need to install the package after_layout.

提交回复
热议问题