Santo Shakil
Santo Shakil

Reputation: 1052

Screen selector on initial launch in Flutter

Let me explain first. I have three screens in my app. These are MyHome.dart, OtherHome.dart and Selector.dart. I want to launch Selector screen on the initial launch. In the Selector screen, there are two options to users. One is MyHome and another is OtherHome. After the first launch, the app will always open the last selected screen by the user on the first launch. What will be the right code for this?

Main.dart:

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

void main() {
  runApp(MaterialApp(
    home: Selector(),
  ));
}

Selector.dart:

import 'package:device_monitor/home.dart';
import 'package:flutter/material.dart';
import 'home.dart';
import 'myhome.dart';

class Selector extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          RaisedButton(
            onPressed: () {
              Navigator.push(
                context,
                MaterialPageRoute(builder: (context) => MyHome()),
              );
            },
            child: Text('My Device'),
          ),
          SizedBox(height: 30),
          RaisedButton(
            onPressed: () {
              Navigator.push(
                context,
                MaterialPageRoute(builder: (context) => Home()),
              );
            },
            child: Text('Others Device'),
          ),
        ],
      ),
    );
  }
}

Upvotes: 2

Views: 1069

Answers (1)

samezedi
samezedi

Reputation: 621

Here a code that can help you:


import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
void main() {
  runApp(MaterialApp(
    home: Selector(),
  ));
}

You need to get sharedpreferences package, here's a link

class Selector extends StatefulWidget {
  @override
  _SelectorState createState() => _SelectorState();
}

class _SelectorState extends State<Selector> {
  
  bool pageReady = false;

  /// This checks the whether page has been selected earlier,
  /// should be placed in an initstate function
  _checkPages() async {
    SharedPreferences local = await SharedPreferences.getInstance();
    if(local.getString('page-selected') != null){
      if(local.getString('page-selected') == "1"){
        //navigate to MyHome

        Navigator.push(
          context,
          MaterialPageRoute(builder: (context) => MyHome()),
        );

      } else {
        //Navigate to Home
        Navigator.push(
          context,
          MaterialPageRoute(builder: (context) => Home()),
        );
      }
    } else {
      setState(() {
        pageReady = true;
      });
    }
  }

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    _checkPages();
  }

  savePage(String type) async {
    if(type == "1"){
      SharedPreferences local = await SharedPreferences.getInstance();
      local.setString('page-selected', type);
      Navigator.push(
        context,
        MaterialPageRoute(builder: (context) => MyHome()),
      );
    } else {
      SharedPreferences local = await SharedPreferences.getInstance();
      local.setString('page-selected', type);
      Navigator.push(
        context,
        MaterialPageRoute(builder: ( context ) => Home()),
      );
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: pageReady ? Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          RaisedButton(
            onPressed: () {
              savePage("1");
            },
            child: Text('My Device'),
          ),
          SizedBox(height: 30),
          RaisedButton(
            onPressed: ()  {
              savePage("2");
            },
            child: Text('Others Device'),
          ),
        ],
      ) : Center(child: CircularProgressIndicator()),
    );
  }
}

class MyHome extends StatefulWidget {
  @override
  _MyHomeState createState() => _MyHomeState();
}

class _MyHomeState extends State<MyHome> {
  @override
  Widget build(BuildContext context) {
    return Container();
  }
}


class Home extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container();
  }


So, I changed Selector() to a stateful widget and used an initState() to check if the user already selected a page previously, if yes, it routes the user to that page else it opens the selector page and once the user selects a page I save the page in session also with the savePage() function.

Upvotes: 3

Related Questions