Флаттер показывает логин или начальный экран на основе данных настроек

#flutter

Вопрос:

Я знаю, что этот вопрос задавали многие, но я безуспешно пытался работать над кодом. Я использую общие настройки для хранения своей электронной почты после входа пользователя в систему и после выхода из системы электронное письмо должно быть удалено. Это прекрасно работает. При запуске приложения оно должно считывать электронную почту с телефона, используя общие настройки, и если электронная почта существует, пользователь вошел в систему и должен быть переведен на главный экран (), иначе, если электронная почта не существует, пользователь не вошел в систему и поэтому должен быть переведен на экран входа (). Ниже приведен мой код, который при запуске приложения всегда отображается на экране Home (), даже если пользователь вышел из системы. Любой, кто поможет мне понять, где я делаю не то, что нужно. Заранее спасибо.

 Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {

  Future<String> getSharedPrefs() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    String _email = prefs.getString('email') ?? '';
    return _email;
  }

  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'chat app',
      home: FutureBuilder<String>(
        future: getSharedPrefs(),
        builder: (
          BuildContext context,
          AsyncSnapshot<String> snapshot,
        ) {
          if (snapshot.connectionState == ConnectionState.waiting) {
            return CircularProgressIndicator();
          } else if (snapshot.connectionState == ConnectionState.done) {
            if (snapshot.hasError) {
              return const Text('Error');
            } else if (snapshot.hasData) {
              return Home();
            } else {
              return Login();
            }
          } else {
            return Text('State: ${snapshot.connectionState}');
          }
        },
      ),
    );
  }
}
 

Ответ №1:

Ваш снимок.hasData всегда будет иметь значение true, так как вы возвращаете пустую строку в методе getSharedPrefs, если сообщение электронной почты не существует.

Вы должны изменить его, чтобы snapshot.hasData amp;amp; snapshot.data.isNotEmpty он работал так, как вы ожидаете.

Комментарии:

1. Большое тебе спасибо, ПайануВлад23. Я изменил его, и он работает так, как я ожидаю, что он будет работать