#flutter #dart
#flutter #dart
Вопрос:
Я нахожусь в процессе веб-разработки мобильного приложения Flutter и пытаюсь обойти проблему отсутствия поддержки поставщика путей в Web.
Я использую пакет PDF (pdf: ^ 1.9.0) для создания PDF-документа и загрузки его на Google Диск, и я пытаюсь выяснить, могу ли я сгенерировать и сохранить PDF-файл в памяти, чтобы сделать его совместимым с Интернетом.
Пример текущего кода с использованием поставщика путей.
createFile() async {
final downloads = await getApplicationSupportDirectory();
final file = File("${downloads.path}/$filename.pdf");
await file.writeAsBytes(pdf.save());
await GoogleDriveController.uploadFileToGoogleDrive(file.path);
}
Вопрос: Есть ли способ генерировать и сохранять файлы в памяти для web с использованием Flutter web?
Комментарии:
1. нет, вы не можете сохранить
File
файлы в памяти2. @pskink Спасибо за подтверждение, похоже, мне придется перенести это в функцию GCP.
Ответ №1:
Мне удалось найти обходной путь для генерации PDF-файла и вместо этого запустить загрузку через браузер, и я подумал, что должен опубликовать, если кто-нибудь наткнется на это.
//Create PDF in Bytes
Uint8List pdfInBytes = pdf.save();
//Create blob and link from bytes
final blob = html.Blob([pdfInBytes], 'application/pdf');
final url = html.Url.createObjectUrlFromBlob(blob);
final anchor = html.document.createElement('a') as html.AnchorElement
..href = url
..style.display = 'none'
..download = 'pdf.pdf';
html.document.body.children.add(anchor);
//Trigger the download of this PDF in the browser.
RaisedButton(
child: Text('Press'),
onPressed: () {
anchor.click();
Navigator.pop(context);
},
)
Комментарии:
1. Я использую этот подход и он отлично работает в Chrome во время отладки и в Safari на моем Macbook. Но это вообще ничего не дает, если я захожу в веб-приложение на своем iPhone. Есть идеи, почему это может происходить?
Ответ №2:
Мой ответ — это вариант на Yonkee, приведенный выше, специально для flutter web. В этом ответе я добавил необходимый импорт (dart: html и dart: typed_data) и добавил форматирование текста, поскольку мне нужна была эта функция.
import 'package:flutter/material.dart';
import 'package:pdf/widgets.dart' as pw;
import 'dart:typed_data';
import 'dart:html' as html;
class PDFSave extends StatefulWidget {
@override
_PDFSaveState createState() => _PDFSaveState();
}
class _PDFSaveState extends State<PDFSave> {
final pdf = pw.Document();
var anchor;
savePDF() async {
Uint8List pdfInBytes = await pdf.save();
final blob = html.Blob([pdfInBytes], 'application/pdf');
final url = html.Url.createObjectUrlFromBlob(blob);
anchor = html.document.createElement('a') as html.AnchorElement
..href = url
..style.display = 'none'
..download = 'pdf.pdf';
html.document.body.children.add(anchor);
}
createPDF() async {
pdf.addPage(
pw.Page(
build: (pw.Context context) => pw.Column(
children: [
pw.Text('Hello World', style: pw.TextStyle(fontSize: 40)),
],
),
),
);
savePDF();
}
@override
void initState() {
super.initState();
createPDF();
}
@override
Widget build(BuildContext context) {
return Scaffold(backgroundColor: Colors.transparent,
appBar: AppBar(
title: Text('PDF Creator'),
),
body: Center(
child:RaisedButton(
child: Text('Press'),
onPressed: () {
anchor.click();
Navigator.pop(context);
},
)
));
}
}