【发布时间】:2019-12-13 16:28:54
【问题描述】:
所以我有一个对象的地图,我想使用 googleapis 插件将其保存为 Google Drive 中的 .json 文件。但是文档太差了,我就是想不通。
我已经尝试过这些教程/示例 https://qiita.com/aoinakanishi/items/6ff8222847fcf934a64a(it是中国人,哈哈) https://github.com/dart-lang/googleapis_examples/blob/master/drive_upload_download_console/bin/main.dart
他们有一些有效的部分和一些无效的部分
class GoogleDriveDatabase{
GoogleSignIn googleSignIn ;
GoogleHttpClient client;
drive.DriveApi api;
String fileId = "";
static Future<GoogleDriveDatabase> init(BuildContext context) async{
GoogleDriveDatabase _googleDriveDatabase = GoogleDriveDatabase();
_googleDriveDatabase.googleSignIn = GoogleSignIn(
scopes: < String > [
drive.DriveApi . DriveFileScope ,
],
);
GoogleSignInAccount googleSignInAccount = await
_googleDriveDatabase.googleSignIn.signInSilently();
if(googleSignInAccount == null){
launchPage(context, WelcomePage());
return null;
}
Map authHeaders = await googleSignInAccount.authHeaders;
_googleDriveDatabase.client = GoogleHttpClient(authHeaders);
_googleDriveDatabase.api = drive.DriveApi(_googleDriveDatabase.client);
return _googleDriveDatabase;
}
Future createDatabaseToDrive(String jsonFileName) async{
drive.File file = drive.File.fromJson({"name":jsonFileName});
drive.GeneratedIds generatedIds =await api.files.generateIds(space:
"drive",count: 1);
generatedIds.ids.forEach((f){
file.id = f;
});
return api.files.create(
file,
);
}
Future updateDbToDrive(Future<File> jsonFileFuture, String jsonFileName)
async{
drive.File file = drive.File.fromJson({"name":jsonFileName});
file.id=jsonFileName;
File jsonFile = await jsonFileFuture;
//if it doesn't work catch the error on future
return (api.files.update(
file,
jsonFileName,
uploadMedia: drive.Media(jsonFile.openRead(),jsonFile.lengthSync())
));
}
// Download a file from Google Drive.
Future downloadFile(String jsonFileName)async {
bool fileExists = false;
var fileList = await api.files.list();
fileList.files.forEach((f)async{
var files = await api.files.list();
files.files.forEach((f){
fileId= f.id;
fileExists = true;
});
});
var file;
if(!fileExists){
file = await createDatabaseToDrive( jsonFileName);
}else{
file =await api.files.get(jsonFileName);
}
return client.readBytes(file.downloadUrl).then((bytes) {
IOSink stream = new File(jsonFileName).openWrite()..add(bytes);
return stream.close();
});
}
}
class GoogleHttpClient extends IOClient {
Map<String, String> _headers;
GoogleHttpClient(this._headers) : super();
@override
Future<StreamedResponse> 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));
}
现在我只想要一个方法,我可以传递我更新的地图对象,将其转换为 .json 文件并将其保存或创建到驱动器,以及获取文件并将其作为 Map 对象读取的另一种方法(在不知道文件 ID 的情况下,我只是尝试通过循环遍历所有文件,就像您在代码 sn-p 中看到的那样)。
【问题讨论】:
标签: json flutter dart google-api google-drive-api