Циркулярный индикатор прогресса во флаттере продолжает вращаться

#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? Тот, который я показал, был из пакета, но при его использовании произошла ошибка