我是 Flutter 的新手。我对保存在 firebase 存储和 firebase 数据库中的 Pdf View 有疑问。我可以将 pdf 上传到存储并将 pdf 地址从存储保存到 firestore 数据库。我也可以在我的应用程序中阅读 pdf 地址,但 View 未显示此 pdf。没有人能帮帮我吗?
import 'dart:math';
import 'dart:typed_data';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:file_picker/file_picker.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_storage/firebase_storage.dart';
import 'package:flutter/material.dart';
import 'package:syncfusion_flutter_pdfviewer/pdfviewer.dart';
import 'package:flutter_cached_pdfview/flutter_cached_pdfview.dart';
main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp(options:
const FirebaseOptions(apiKey: 'AIzaSyCXLARHpyIfXiB8QRgijj1nsPTfXf_Ra6k',
appId: '1:719137220947:android:4afa9a85243a7d0eb9d9a6',
messagingSenderId: '719137220947',
projectId: 'fir-son-60ef4',
storageBucket:'gs://fir-son-60ef4.appspot.com'));
runApp(const MaterialApp(
debugShowCheckedModeBanner: false,
home: MyAppkitapoku(),
));
}
class MyAppkitapoku extends StatefulWidget {
const MyAppkitapoku({Key? key}) : super(key: key);
@override
State<MyAppkitapoku> createState() => _MyAppkitapokuState();
}
class _MyAppkitapokuState extends State<MyAppkitapoku> {
String url="";
int number=0;
uploadDataToFirebase()async {
//generate random number
number = Random().nextInt(10);
//pick PDF File
FilePickerResult? result = await FilePicker.platform.pickFiles();
if (result != null) {
Uint8List? pick = result.files.first.bytes;
String file = result.files.first.name;
file.replaceAll(" ", "_");
// Upload file
var task = await FirebaseStorage.instance.ref(file).putData(
pick!);
TaskSnapshot snapshot = task;
url = await snapshot.ref.getDownloadURL();
//upload url to cloud
await FirebaseFirestore.instance
.collection("kitaplar")
.doc()
.set({
'url': url,
'kitapadi': "Kitap: $number $file"});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("PDF Oku"),
),
body: StreamBuilder(
stream: FirebaseFirestore.instance.collection("kitaplar").snapshots(),
builder: (context,AsyncSnapshot<QuerySnapshot> snapshot){
if (snapshot.hasData) {
return ListView.builder(
itemCount: snapshot.data!.docs.length,
itemBuilder: (context, i) {
QueryDocumentSnapshot x = snapshot.data!.docs[i];
return InkWell(
onTap: () {Navigator.push(context, MaterialPageRoute(builder: (context)=>
View(url: x['url'])//PDFViewer(url: x["url"]),
));
debugPrint(x['url']);},
child: Container(
margin: const EdgeInsets.symmetric(vertical: 10),
child: Text(x["kitapadi"]),
),
);
}
);
}
return const Center(
child: CircularProgressIndicator(),
);
},
),
floatingActionButton: FloatingActionButton(onPressed: uploadDataToFirebase,child: const Icon(Icons.add),) ,
);
}
}
class View extends StatelessWidget {
final _pdfViewerController=PdfViewerController();
final String url;
View({super.key, required this.url});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("PDF Görüntüle-View"),
),
body:
SfPdfViewer.network(
url,
controller: _pdfViewerController,
),
);
}
}
class PDFViewer extends StatelessWidget {
final String url;
const PDFViewer({super.key, required this.url});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('PDF Görüntüle- PDFViewer'),
),
body: const PDF().fromUrl(
url,
placeholder: (progress) => const Center(child: CircularProgressIndicator()),
errorWidget: (error) => const Center(child: Text('Yükleme Hatası'),),
),
);
}
}
我尝试通过 2 个不同的视图(View 和 PdfViewer)查看视图,但我都无法成功。 Flutter 不会给出任何错误警告。同样,flutter doctor 中没有出现任何错误。
我检查了 debugPrint() 以查看是否可以将 PDF url 从存储提取到数据库,然后从那里提取到我的应用程序,我看到我可以提取 pdf 地址的 url,当我将此 url 键入资源管理器时,我的文件被显示。
[[](
)](
)