Флаттер: вызов различных страниц, зависящих от ситуации (зарегистрированный или незарегистрированный пользователь) - PullRequest
0 голосов
/ 17 апреля 2020

У меня проблема с моим приложением.

Ситуация такова: у меня очень простая система входа в приложение, и я сохраняю зарегистрированного пользователя с помощью SharedPreferences. Но если пользователь покидает приложение и затем возвращается, он снова открывает экран входа в систему, поэтому я хочу пропустить экран входа в систему, если пользователь вошел в систему.

Так что в моем главном я поставил функцию, чтобы проверить, есть ли это информация для входа, если да, она перенаправит прямо на страницу приложения или на страницу входа, если нет. Но когда я пытаюсь вызвать страницу приложения, она всегда вызывает страницу, установленную на домашней странице.

Как я могу решить эту проблему? Есть ли способ заставить его игнорировать Дом? Есть ли способ сделать "если" часть дома? Было бы лучшим решением, но это невозможно.

Также я знаю, что я не использую лучший способ сделать этот элемент управления, но он работает (несмотря на эту проблему у меня сейчас, конечно), и если у вас есть любые советы по его улучшению, я был бы признателен.

Вот мой код:


class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

void main() => runApp(new MyApp());

class _MyAppState extends State<MyApp> {
  Future<void> verificaLogin() async {
    print("running ok"); //just to test if the function runs
    final prefs = await SharedPreferences.getInstance();
    final key = 'usuario';
    final value = prefs.getString(key);
    print('saved tester $value');
    String usu = value; /

    if (usu.isEmpty) {
      BuildContext context;
      Navigator.push(
        context,
        MaterialPageRoute(builder: (context) => LoginScreen()), //sends to loginscreen if not logged
      );
    }
    if (usu.isNotEmpty) {
      BuildContext context;
      Navigator.of(context)
          .pushReplacement(MaterialPageRoute(builder: (context) => Pedidos())); //sends to main (not main.dart) app page
    }
  }

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addPostFrameCallback((_) => verificaLogin());
  }

  Widget build(BuildContext context) {
    return BotToastInit(
      child: MaterialApp(
        navigatorObservers: [BotToastNavigatorObserver()],
        title: "Test App",
        theme: ThemeData(
          primarySwatch: Colors.green,
        ),
        debugShowCheckedModeBanner: false,
        home: LoginScreen(), //i'm calling the loginscreen, it ignores the function on the top
      ),
    );
  }
}


Ответы [ 2 ]

1 голос
/ 17 апреля 2020

Пожалуйста, сделайте один SplashScreen, как показано ниже, чтобы решить вашу проблему ..
и назовите это как home: SplashScreen(),

class SplashScreen extends StatefulWidget {
  @override
  _SplashScreenState createState() => _SplashScreenState();
}

class _SplashScreenState extends State<SplashScreen> {
  String loginData = "";

  SharedPreferences sharedPreferences;
  void initState() {
    super.initState();
    readFromStorage();
  }

  void readFromStorage() async {
    sharedPreferences = await SharedPreferences.getInstance();
    final key = 'usuario';
    loginData = sharedPreferences.getString(key);

    if (loginData.isNotEmpty) {
      Future.delayed(const Duration(milliseconds: 3000), () {
        setState(() {
          Navigator.of(context)
      .pushReplacement(MaterialPageRoute(builder: (context) => Pedidos()));
        });
      });
    } else {
      Future.delayed(const Duration(milliseconds: 3000), () {
        setState(() {
           Navigator.push(
    context,
    MaterialPageRoute(builder: (context) => LoginScreen()),);
        });
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
          child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          FlutterLogo(
            size: 100.0,
          ),
        ],
      )),
    );
  }
}
0 голосов
/ 17 апреля 2020

Привет, вы можете использовать FutureBuilder на vefiricaLoigin, а затем Material App в домашних условиях использовать verificaLogin, https://api.flutter.dev/flutter/widgets/FutureBuilder-class.html

verificaLogin() {
    return FutureBuilder<Widget>(
     future: SharedPreferences.getInstance(),
     builder: (BuildContext context, prefs) {
      final key = 'usuario';
      final value = prefs.getString(key);
      String usu = value;
      if (usu.isEmpty) {
       return LoginScreen()l
      } else {
      return Pedidos();
    }
  );
}     

     Widget build(BuildContext context) {
        return MaterialApp(
            title: "Test App",
            theme: ThemeData(
              primarySwatch: Colors.green,
            ),
            debugShowCheckedModeBanner: false,
            home: verificaLogin()
        );
      }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...