Я новичок, и мне нужна помощь. Я строю многостраничное приложение и из навигации, используя названные маршруты. использование пакета провайдера для управления состоянием аутентификации. Ниже мой код.
class MainWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
ChangeNotifierProvider.value(value: Auth()),
],
child: Consumer<Auth>(
builder: (ctx, authData, child) =>
MaterialApp(
debugShowCheckedModeBanner: false,
title: "SupraFin",
theme: ThemeData(
primaryColor: Colors.blue,
accentColor: Colors.grey,
fontFamily: 'Overpass'),
home: authData.isAuthenticated
? Scaffold(body: Center(child: Text('inAuthenticated Flow'),),)
: FutureBuilder(
future: authData.tryAutoLogin(),
builder: (ctx, authDataSnapshot) {
if (authDataSnapshot.connectionState ==
ConnectionState.waiting) {
return LoadingScreen();
}
return SplashScreen();
}),
routes: MyRoutes.routes,
),
),
);
}
}
Ниже класс MyRoutes, который я использую для поддержки маршрутов в одном файле.
static const SPLASH_PAGE = '/';
static const LOGIN_PAGE = '/login';
static const SIGN_UP_PAGE = '/signup';
static const HOME_PAGE = '/home-page';
static const LOGIN_OTP_PAGE = '/login-otp-page';
static final routes = {
// SPLASH_PAGE: (_) => SplashScreen(),
LOGIN_PAGE: (_) => LoginPage(),
LOGIN_OTP_PAGE: (_) => ActivateOTPPage(),
// SIGN_UP_PAGE : (_) =>
HOME_PAGE: (_) => HomePage(),
};
}
Ниже мой поставщик аутентификации, в остальных сервисах я просто сделать http-запрос и выдать ошибку, которую я ловлю на виджете. 11: 32
class Auth with ChangeNotifier {
String _token;
DateTime _expiryDate;
UserType _userType;
bool _isOTPVerified = false;
Timer _authTimer;
bool get isAuthenticated {
print(token != null && _isOTPVerified);
return token != null && _isOTPVerified;
}
String get token {
if (_expiryDate != null &&
_expiryDate.isAfter(DateTime.now()) &&
_token != null) {
return _token;
}
return null;
}
UserType get user{
return _userType;
}
Future<UserType> login(String email, String password) async {
RESTServices restServices = RESTServices();
var response = await restServices.post(
LOGIN_URL,
{'email': email, 'password': password},
);
if (response == null) {
return null;
}
var user = UserType.fromJson(response);
_token = user.accessToken;
_expiryDate = user.expiresAt;
_userType = user;
autoLogout();
notifyListeners();
var pref = await SharedPreferences.getInstance();
pref.setString('userData', json.encode(user.toJson()));
return user;
}
Future<bool> verifyOtp(String otp) async {
var restServices = RESTServices();
var response = await restServices.post(VERIFY_OTP_URL, {'otp': otp});
if (response == null) {
return false;
}
if (response['status'] != null && response['status'] == 'success') {
_isOTPVerified = true;
notifyListeners();
return true;
}
return false;
}
void logout() async{
print('Auth Provider: Logout');
_token = null;
_expiryDate = null;
_userType = null;
if(_authTimer != null){
_authTimer.cancel();
_authTimer = null;
}
notifyListeners();
var pref = await SharedPreferences.getInstance();
pref.remove('userData');
}
void autoLogout(){
print('Inside AutoLogOut');
if(_authTimer != null){
_authTimer.cancel();
_authTimer = null;
}
var timeLeftInSec = _expiryDate.difference(DateTime.now()).inSeconds;
_authTimer = Timer(Duration(seconds: 3), () => logout());
}
Future<bool> tryAutoLogin() async{
print('Inside Auto Login');
var pref = await SharedPreferences.getInstance();
if(!pref.containsKey('userData')){
print('Does Not contains key in pref');
return false;
}
var user = UserType.fromJson(json.decode(pref.getString('userData')));
if(user.expiresAt.isBefore(DateTime.now())){
print('Token is expired');
return false;
}
_token = user.accessToken;
_expiryDate = user.expiresAt;
_userType = user;
// notifyListeners();
autoLogout();
return true;
}
}
Таким образом, после входа я перенаправляю, чтобы проверить экран OTP, согласно коду через 3 секунды при входе в систему он должен автоматически отключиться и уведомить потребителя выше MaterialApp (), это должно снова проверить, проверена ли аутентификация false затем показывает экран spla sh. но это все еще на странице проверки OTP. я проверил, что isAuthenticated является ложным. Не понимая, в чем проблема.
Я также пытался с ChangeNotifierProvider (create: (ctx) => Auth ()), он все еще не работал.
Пожалуйста, помогите решить. Спасибо.