You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用advance_pdf_viewer2加载Google Drive PDF遇RangeError(index)求助

问题:advance_pdf_viewer2加载Google Drive PDF出现RangeError(index)错误

使用advance_pdf_viewer2插件加载Google Drive中的PDF文件时,突然出现RangeError(index): Invalid value: Valid value range is empty: 0错误。此前功能正常,测试其他PDF URL可正常加载,但该Google Drive链接无法工作(之前表现正常)。

代码示例

import 'package:flutter/material.dart';
import 'package:advance_pdf_viewer2/advance_pdf_viewer.dart';

class FmtCH11 extends StatefulWidget {
  @override
  _GeneralState createState() => _GeneralState();
}

class _GeneralState extends State<FmtCH11> {
  bool _isLoading = true;

  late PDFDocument _doc;

  String url =
      "https://drive.google.com/uc?export=download&id=1oqzz9m6IcJFpXuMWWnvkXYfXPlpfEOBo";

  void initState() {
    super.initState();

    _initPdf();
  }

  _initPdf() async {
    setState(() {
      _isLoading = true;
    });
    final doc = await PDFDocument.fromURL(url);
    setState(() {
      _doc = doc;
      _isLoading = false;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text("Introduction"),
        ),
        body: _isLoading
            ? Center(
                child: CircularProgressIndicator(),
              )
            : PDFViewer(
                document: _doc,
              ));
  }
}

错误信息

[VERBOSE-2:dart_vm_initializer.cc(41)] Unhandled Exception: RangeError (index): Invalid value: Valid value range is empty: 0
#0      _Array.[] (dart:core-patch/array.dart:10:36)
#1      _PDFViewerState._loadPage
viewer.dart:149
#2      _PDFViewerState.didChangeDependencies
viewer.dart:125
#3      StatefulElement._firstBuild
framework.dart:5237
#4      ComponentElement.mount
framework.dart:5062
#5      Element.inflateWidget
framework.dart:3971
#6      Element.updateChild
framework.dart:3702
#7      ComponentElement.performRebuild
framework.dart:5111
#8      Element.rebuild
framework.dart:4805
#9      StatelessElement.update
framework.dart:5162
#10     Element.updateChild (package:flutter/src/widgets/framew<…>
解决方案

1. 检查Google Drive链接有效性

Google Drive的export=download链接可能因权限变更、文件删除或ID失效无法访问:

  • 直接在浏览器打开该URL,若跳转到权限验证页面,需将文件权限设置为**"任何有链接的人都可查看"**,重新生成下载链接。
  • 若返回404,确认文件ID是否正确,或文件是否被删除。

2. 处理Google Drive重定向问题

Google Drive的下载链接常触发重定向,插件可能未正确处理。可手动获取真实下载链接:

  1. 打开Google Drive文件页面,点击"下载"。
  2. 在浏览器开发者工具"网络"面板中,找到PDF格式的请求,复制其真实URL(通常为https://doc-xx-docs.googleusercontent.com/...格式),替换代码中的url变量。

3. 增加错误捕获逻辑

在加载PDF的方法中添加异常处理,避免崩溃并提示用户:

_initPdf() async {
  setState(() {
    _isLoading = true;
  });
  try {
    final doc = await PDFDocument.fromURL(url);
    setState(() {
      _doc = doc;
      _isLoading = false;
    });
  } catch (e) {
    setState(() {
      _isLoading = false;
    });
    ScaffoldMessenger.of(context).showSnackBar(
      SnackBar(content: Text("PDF加载失败: $e")),
    );
  }
}

4. 预下载PDF到本地加载

若链接问题无法解决,先下载文件到本地再加载:

import 'dart:io';
import 'package:http/http.dart' as http;
import 'package:path_provider/path_provider.dart';

_initPdf() async {
  setState(() {
    _isLoading = true;
  });
  try {
    // 下载文件到临时目录
    final response = await http.get(Uri.parse(url));
    final dir = await getTemporaryDirectory();
    final file = File('${dir.path}/temp.pdf');
    await file.writeAsBytes(response.bodyBytes);
    
    // 加载本地PDF
    final doc = await PDFDocument.fromFile(file);
    setState(() {
      _doc = doc;
      _isLoading = false;
    });
  } catch (e) {
    setState(() {
      _isLoading = false;
    });
    ScaffoldMessenger.of(context).showSnackBar(
      SnackBar(content: Text("PDF加载失败: $e")),
    );
  }
}

5. 检查插件版本兼容性

确保advance_pdf_viewer2与当前Flutter SDK版本兼容,尝试更新插件到最新版本:
在pubspec.yaml中修改版本后执行flutter pub get:

dependencies:
  advance_pdf_viewer2: ^latest_version

内容的提问来源于stack exchange,提问作者YASH PATHAK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 02:35:57