我有一个应用程序,我创建了一个登录和注销页面。。。当我点击我的应用程序的注销按钮时,我会得到这样的错误";对空值使用的空校验运算符"*当我指出错误时,它告诉我[1]:https://i.stack.imgur.com/n0uJ8.pngentrez
导入"dart:async";导入"dart:convert";导入"dart:async";导入"dart:convert";导入"dart:math";导入"package:flutter/material.dart";导入"package:http://dart";导入'package:logger/logger.dart';
import '../db/db_auth_shared_preference.dart'; import '../network/app_urls.dart'; import '../models/auth.dart'; enum Status { notLoggedIn, loggedIn, authenticating, loggedOut, notReet, reseted, resetting } //Help display the logs var logger = Logger(); class AuthProvider with ChangeNotifier { Auth? _auth; Auth get auth => _auth!; void setAuth(Auth auth) { _auth = auth; notifyListeners(); } bool isAuth() { if (_auth == null || auth.token == '') { return false; } return true; } // Time before the token expires Timer? _authTimer; DateTime? _expiryDate; String? username; String? password; // Set the status of the user to Not Logged In at the start of the app Status _status = Status.notLoggedIn; Status get status => _status; // Change the status of the user set status(Status value) { _status = value; notifyListeners(); } // Log In the user Future<Map<String, dynamic>> login(String email, String password) async { Map<String, Object> results; final Map<String, dynamic> loginData = { 'email': email, 'password': password }; status = Status.authenticating; logger.d("--- Authentication ---"); try { Response response = await post( Uri.parse( "${AppUrl.login}? username=${loginData['email']}&password=${loginData['password']}"
),);
logger.d('Login response : ${response.statusCode}'); // The Request Succeded if (response.statusCode == 200) { final Map<String, dynamic> responseData = json.decode(utf8.decode(response.bodyBytes)); var requestStatus = responseData["status"]; if (requestStatus != 0) { status = Status.notLoggedIn; results = {'status': false, 'message': "La Connexion a échoué"}; } else { // Get the status code of the request Map<String, dynamic> authData = responseData["utilisateurJson"]; logger.d(authData); _expiryDate = DateTime.now().add(const Duration(seconds: 3500)); //store user shared pref Auth authUser = Auth.fromMap(authData, timeToExpire: _expiryDate, username: loginData['email'], password: loginData['password']); _expiryDate = authUser.expiryDate; logger.wtf(_expiryDate); //clear session data AuthPreferences().removeAuth(); //store User session AuthPreferences().saveAuth(authUser); setAuth(authUser); status = Status.loggedIn; username = loginData["email"]; password = loginData["password"]; results = { 'status': true, 'message': 'Successful login', 'auth': authUser, }; autoLogOut(); } } else { status = Status.notLoggedIn; results = {'status': false, 'message': 'La Connexion a échoué'}; } return results; } catch (e) { logger.e(e); status = Status.notLoggedIn; results = { 'status': false, 'message': "La Connexion avec le serveur a échoué" }; return results; } } void autoLogOut() { if (_authTimer != null) { _authTimer!.cancel(); } final timeToExpiry = _expiryDate!.difference(DateTime.now()).inSeconds; _authTimer = Timer(Duration(seconds: timeToExpiry), () async => await login(username!, password!)); } // Log Out the User void logOut() { logger.d("--- User Logging Out ---"); AuthPreferences().removeAuth(); status = Status.loggedOut; _expiryDate = null; _auth = null; logger.d("--- User Logged Out ---"); } Future<Auth?> tryAutoLogin() async { final authSession = await AuthPreferences().getAuth(); if (authSession == null) { return null; } logger.d("The expiry time is : ${authSession.expiryDate}"); if (authSession.expiryDate.isBefore(DateTime.now())) { login(authSession.username, authSession.password); return authSession; } _expiryDate = authSession.expiryDate; setAuth(authSession); logger.d("SETTING THE USER"); autoLogOut(); return authSession; } }
错误解释:Bang运算符(!(表示在flutter中,当您使用此运算符时,您完全可以确定变量在任何情况下都不会为null
有两种解决方法-
- 如果有条件,则使用确认变量不为null
- 如果运算符为null,则使用null感知或喜欢
Auth get auth => _auth ?? Auth();
由于您没有提供任何错误日志;基于所附的图像,作为第29行上的光标,_auth
变量为null
。因此,在使用!
之前,请确保您的变量不是null
。