connect static method
The primary method to get a connected DropboxProvider instance. It now handles token storage internally.
Implementation
static Future<DropboxProvider?> connect({
required String appKey,
required String appSecret,
required String redirectUri,
}) async {
if (appKey.isEmpty || appSecret.isEmpty) {
throw ArgumentError(
'App registration required: https://www.dropbox.com/developers/apps');
}
if (redirectUri.isEmpty) {
throw ArgumentError(
"redirectUri is empty. Please ensure your redirect URI is correctly configured as per the package documentation.");
}
final provider = DropboxProvider._create(
appKey: appKey,
appSecret: appSecret,
redirectUri: redirectUri,
);
// Attempt to load token from secure storage
DropboxToken? storedToken = await provider._getToken();
if (storedToken != null) {
provider._token = storedToken;
try {
if (provider._token!.isExpired) {
debugPrint(
"DropboxProvider: Stored token is expired, attempting refresh...");
await provider._refreshToken();
await provider
._saveToken(provider._token); // Save the refreshed token
}
await provider._fetchCurrentUserAccount();
provider._isAuthenticated = true;
debugPrint(
"DropboxProvider: Silent sign-in successful for ${provider._account?.email}");
return provider;
} catch (e) {
debugPrint(
"DropboxProvider: Silent sign-in failed ($e). Clearing token and proceeding to interactive login.");
await provider._clearToken();
provider._token = null;
// CHANGE 2: Explicitly reset auth flag on failure to ensure clean state.
provider._isAuthenticated = false;
}
}
debugPrint(
"DropboxProvider: No valid token found. Starting interactive login.");
try {
final authCode = await provider._getAuthCodeViaInteractiveFlow();
if (authCode == null) {
debugPrint("DropboxProvider: Interactive login cancelled by user.");
return null; // User cancelled the flow
}
await provider._completeConnection(authCode);
await provider._saveToken(provider._token); // Save the new token
debugPrint(
"DropboxProvider: Interactive login successful for ${provider._account?.email}");
return provider;
} catch (e) {
debugPrint("DropboxProvider: Interactive login failed. Error: $e");
await provider._clearToken();
return null;
}
}