#flutter #dart
Вопрос:
Я пытаюсь разместить свой индикатор CircularProgressIndicator, когда мое приложение flutter извлекает PDF-файл из моей базы данных firebase. Но странная часть заключается в том, что он не показывает индикатор CircularProgressIndicator при нажатии кнопки для открытия PDF, вместо этого он отображается ВМЕСТЕ (В ОДНО и ТО ЖЕ ВРЕМЯ) при загрузке PDF, что противоречит цели, как я хочу, чтобы он отображался при загрузке, не появляясь одновременно с PDF.
2-я странная вещь заключается в том, что мой индикатор CircularProgressIndicator продолжает вращаться даже после отображения PDF.
Мой код (СТРАНИЦА ПРОСМОТРА PDF):
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_pdfview/flutter_pdfview.dart';
import 'package:flutter_web_browser/flutter_web_browser.dart';
import 'package:path/path.dart';
import 'dart:async';
openBrowserTab() async {
await FlutterWebBrowser.openWebPage(
url:
"https://docs.google.com/forms/d/e/1FAIpQLScdrUJaGxFCLSJV7Njg8WZlqLZOh40Jq000hggexoRjA1-8nQ/viewform?usp=sf_link",
customTabsOptions: CustomTabsOptions(
toolbarColor: Colors.lightBlueAccent,
));
}
class PDFViewerPage extends StatefulWidget {
final File file;
const PDFViewerPage({
Key? key,
required this.file,
}) : super(key: key);
@override
_PDFViewerPageState createState() => _PDFViewerPageState();
}
class _PDFViewerPageState extends State<PDFViewerPage> {
bool isReady = false;
final Completer<PDFViewController> _controller = Completer<PDFViewController>();
String errorMessage = '';
@override
Widget build(BuildContext context) {
final name = basename(widget.file.path);
return Scaffold(
appBar: AppBar(
title: Text(name),
actions: <Widget>[
IconButton(
icon: Icon(
Icons.error,
color: Colors.yellow,
),
onPressed: () => openBrowserTab(),
)
],
),
body: Stack(
children: <Widget>[
PDFView(
pageSnap: false,
pageFling: false,
autoSpacing: false,
filePath: widget.file.path,
onRender: (_pages) {
setState(() {
isReady = true;
});
},
onError: (error) {
setState(() {
errorMessage = error.toString();
});
print(error.toString());
},
onPageError: (page, error) {
setState(() {
errorMessage = '$page: ${error.toString()}';
});
print('$page: ${error.toString()}');
},
onViewCreated: (PDFViewController pdfViewController) {
_controller.complete(pdfViewController);
},
),
errorMessage.isEmpty
? !isReady
? Center(
child: CircularProgressIndicator(),
)
: Container()
: Center(
child: Text('Please check your internet connection'),
),
],
),
);
}
}
Дополнительная информация: Я использую этот пакет для просмотра PDF. https://pub.dev/packages/flutter_pdfview/example
Надеюсь получить некоторые рекомендации от вас, ребята. Спасибо!
Комментарии:
1. Где вы меняете значение
isReady
переменной ?2. Привет, приятель! Где я должен установить значение isReady в значение true, а где в значение false?
3. Вы создаете его так, как
false
это имеет смысл, но вам нужно изменить его, когда файл загружен, вы проверяетеfalse
, почему spinner никогда не уходит. Есть лиonReady
в нем какая-либо функция для изменения значения ti ?4. Хорошо, я добавил OnRender и установил значение true, но как ciruclarprogressindicator не отображается
Ответ №1:
добавьте этот код в поле pdfView
, вам нужно изменить значение isReady
, когда будет выполнена отрисовка страницы.
onRender: (_pages) {
setState(() {
isReady = true;
});
},
Комментарии:
1. Я добавил, но как мне запустить circularprogressindicator, если он не отображается?
2. вы можете добавить
PDFViewController
; надеюсь, что решите эту проблему.3. ты имеешь в виду добавить это
onViewCreated: (PDFViewController pdfViewController) { _controller.complete(pdfViewController); },
?4. да, ты можешь попробовать с этим
5. хм, не могли бы вы показать мне пример кода при добавлении
PDFViewController?
Тот, который я показал, был из пакета, но при его использовании произошла ошибка