Когда я обновляю MaterialApp, я ожидаю, что Navigator также обновит sh, но этого не происходит - PullRequest
1 голос
/ 06 апреля 2020

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

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 ()), он все еще не работал.

Пожалуйста, помогите решить. Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...