San*_*kil 7 file-upload google-api drive dart flutter
我可以googleapis在前台将文件上传到谷歌驱动器,但我需要在我的 flutter 应用程序的后台上传文件。我试图上传,workmanager但它不起作用。这是我的应用程序这篇文章的代码的一些必要部分:
...
@override
void initState() {
WidgetsFlutterBinding.ensureInitialized();
Workmanager.initialize(callbackDispatcher, isInDebugMode: true);
Workmanager.registerPeriodicTask("1", "simplePeriodicTask",
existingWorkPolicy: ExistingWorkPolicy.replace,
frequency: Duration(hours: 1),
initialDelay:
Duration(seconds: 5),
constraints: Constraints(
networkType: NetworkType.connected,
));
super.initState();
login()
}
...
Run Code Online (Sandbox Code Playgroud)
...
这是后台任务:
...
void callbackDispatcher() {
Workmanager.executeTask((task, inputData) {
login();
_HomeState().uploadFileL();
print('Background Services are Working!');
return Future.value(true);
});
}
...
Run Code Online (Sandbox Code Playgroud)
...
这是用于上传文件:
...
Future<void> uploadFileL() async {
final filename = 'Location.db';
final gFile = ga.File();
gFile.name = filename;
final dir = await getExternalStorageDirectory();
final localFile = File('${dir.path}/$filename');
final createdFile = await api.files.create(gFile,
uploadMedia: ga.Media(localFile.openRead(), localFile.lengthSync()));
print('New file created ${createdFile.id}');
setState(() {});
}
...
Run Code Online (Sandbox Code Playgroud)
登录:
class GoogleHttpClient extends IOClient {
Map<String, String> _headers;
GoogleHttpClient(this._headers) : super();
@override
Future<IOStreamedResponse> send(BaseRequest request) =>
super.send(request..headers.addAll(_headers));
@override
Future<Response> head(Object url, {Map<String, String> headers}) =>
super.head(url, headers: headers..addAll(_headers));
}
Run Code Online (Sandbox Code Playgroud)
...
...
Future<void> login() async {
try {
account = await _googleSignIn.signIn();
final client =
GoogleHttpClient(await _googleSignIn.currentUser.authHeaders);
api = ga.DriveApi(client);
} catch (error) {
print('DriveScreen.login.ERROR... $error');
_scaffold.currentState.showSnackBar(SnackBar(
backgroundColor: Colors.red.shade700,
content: Text(
'Error : $error',
style: TextStyle(color: Colors.white),
),
));
}
setState(() {});
}
...
Run Code Online (Sandbox Code Playgroud)
我认为这个问题的可能原因是,无法在后台找到auth客户端来上传文件。你有什么想法?如果我是对的,解决方案是什么?
我们必须使用以下方法:signInSilently()尝试使用先前经过身份验证的帐户登录,而无需任何用户交互。适合在后台服务中使用。
Future<void> upload(context) async {
GoogleSignInAccount? account = await googleSignIn.signInSilently();
if (account == null) {
ScaffoldMessenger.of(context).showSnackBar(const SnackBar(
content: Text("Not logged in"),
));
return;
}
final authHeaders = await account.authHeaders;
final authenticateClient = GoogleAuthClient(authHeaders);
final driveApi = drive.DriveApi(authenticateClient);
final Stream<List<int>> mediaStream =
Future.value([104, 105]).asStream().asBroadcastStream();
var media = drive.Media(mediaStream, 5);
var driveFile = drive.File();
driveFile.name = "hello_world.txt";
final result = await driveApi.files.create(driveFile, uploadMedia: media);
print("Upload result: ${result.name}");
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
600 次 |
| 最近记录: |