пользователь все еще входил в систему после выхода из системы

#flutter #authentication #sharedpreferences

#flutter #аутентификация #общие предпочтения

Вопрос:

Я создавал приложение с помощью flutter и использовал пакет shared_preferences, и на этапе аутентификации я сталкиваюсь с проблемой, когда при создании приложения пользователь входит в систему, и когда я выхожу из системы и перезапускаю приложение после его завершения, оно по-прежнему отображается на главной странице, вот мой код

главный.дротик

 bool checkingKey;


Future<bool> checkKey() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  bool checkingKey=prefs.containsKey("jwt");
  print("$checkingKey");
  return checkingKey;
}

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  Paint.enableDithering = true;
  await checkKey().then((value){
    checkingKey=value;
  });
  runApp(MyApp());
}


class MyApp extends StatelessWidget {


  @override
  Widget build(BuildContext context) {
    // bool check=checkKey().then((bool value) => true);
    print("hello=$checkingKey");
    return MaterialApp(
        home: AnnotatedRegion<SystemUiOverlayStyle>(
          value: SystemUiOverlayStyle(
            statusBarColor: Colors.transparent,
          ),
          child: Scaffold(
            resizeToAvoidBottomInset: false,
            body: Container(
              color: Color(0xffccffcc),
              child:checkingKey==false?LoginPage():mainPage()
            ),
          ),
        ),
        routes: <String,WidgetBuilder>{
          '/home':(BuildContext context)=>mainPage(),
          '/login':(BuildContext context)=>LoginPage(),
      }
      );
  }
}
 

login_signup_Auth.dart для входа в систему

 Future<void> attemptLogIn(String username, String password,BuildContext context) async {
                                                          ///?final storage =parent_inherit.of(context);
                                                          ///?var verify=storage.verify;
  SharedPreferences prefs = await SharedPreferences.getInstance();
  print("$username $password");
  final http.Response res = await http.post(
      "https://green-earth.herokuapp.com/signin",
      headers: <String, String>{
        'Content-Type': 'application/json; charset=UTF-8',
        // 'authorization':'Bearer ' 
      },
      body: jsonEncode(<String, String>{
        "email": username,
        "password": password
      }),
  );
  if(res.statusCode == 200) {
    prefs.setString('jwt',res.body);
    var value=prefs.getString('jwt');
    print("storage= ${value.isEmpty}");
    Navigator.of(context).pushNamed('/home');
  }
  else{
    return _showMyDialoglogin(context,res.statusCode);
  }
}


void logoutOutOfApp(BuildContext context) async{
  SharedPreferences prefs = await SharedPreferences.getInstance();
  prefs.clear();
  Navigator.of(context).pushNamedAndRemoveUntil('/login', (Route<dynamic> route) => false);
}
 

При второй сборке без каких-либо изменений переменной checking key возвращается ‘true’, чего я не знаю, как это может быть возможно!!!!!!

Я не понимаю, что я делаю неправильно, также, если вы видите какую-либо другую проблему, которая может сделать программу эффективной или любой другой код, который должен быть использован. пожалуйста, сообщите

Большое Вам спасибо!!

Ответ №1:

Почему вы все усложняете ? Ваша main.dart банка просто выглядит так

 bool checkingKey;

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  Paint.enableDithering = true;

  var prefs = await SharedPreferences.getInstance();
  checkingKey = prefs.containsKey("jwt");

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    print("hello=$checkingKey");
    return MaterialApp(
      home: AnnotatedRegion<SystemUiOverlayStyle>(
        value: SystemUiOverlayStyle(
          statusBarColor: Colors.transparent,
        ),
        child: Scaffold(
          resizeToAvoidBottomInset: false,
          body: Container(
            color: Color(0xffccffcc),
            child: !checkingKey ? LoginPage() : mainPage(),
          ),
        ),
      ),
      routes: <String,WidgetBuilder>{
        '/home':(BuildContext context) => mainPage(),
        '/login':(BuildContext context) => LoginPage(),
      },
    );
  }
}
 

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

1. Я думаю , это сработало . Большое вам спасибо, но можете ли вы сказать, что я делал неправильно, даже если это было сложно, но вы видели что-то неправильное? Пожалуйста, скажите, это действительно поможет мне выявить проблемы в моем коде. И еще раз спасибо

2. bool checkingKey рассматривается как глобальная переменная. void main это ваша точка входа в приложение. В строке checkingKey = prefs.containsKey("jwt"); ваша глобальная переменная инициализируется для всей области вашего приложения. Таким MyApp образом, класс будет просто использовать переменную с ее текущим значением

3. о! Итак, это происходит только для dart или для других языков?