共享的偏好颤音 - 根据书名保存

发布于 2025-02-03 02:56:19 字数 3048 浏览 5 评论 0原文

我正在研究PDF查看器,在那里我正在尝试将用户读取为book_title ID(TID)的最后一页。当用户恢复阅读时,他将其重定向到以前取决于每本书的地方。

我面临的问题是共享的偏好并未保存到每个book_title ID上。它将最后一页保存到所有书籍中

book_title id setpage

var book;
int bookPage = 1;
int setPage = 1;

  @override
  void initState() {
    book = '${widget.tid}';
    _pdfViewerController = PdfViewerController();
    getPref();
    super.initState();
  }

  getPref() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    prefs.setInt('${book}', setPage);
    bookPage = prefs.getInt('${book}')!;

    print(book);
  }

完整代码

class libraryPDF extends StatefulWidget {
  final String? sid;
  final String? tid;
  final String? page;
  const libraryPDF({Key? key, this.sid, this.page, this.tid}) : super(key: key);

  @override
  State<libraryPDF> createState() => _libraryPDFState();
}

var book;
int bookPage = 1;
int setPage = 1;

class _libraryPDFState extends State<libraryPDF> {
  late PdfViewerController _pdfViewerController;
  final GlobalKey<SfPdfViewerState> _pdfViewerStateKey = GlobalKey();

  @override
  void initState() {
    book = '${widget.tid}';
    _pdfViewerController = PdfViewerController();
    getPref();
    super.initState();
  }

  getPref() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    await prefs.setInt('${book}', setPage);
    bookPage = await prefs.getInt('${book}')!;

    print(book);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        centerTitle: true,
        elevation: 0,
        title: const Text("CanadianHS"),
        backgroundColor: Colors.blue[900],
        actions: <Widget>[
          IconButton(
              onPressed: () {
                _pdfViewerStateKey.currentState!.openBookmarkView();
              },
              icon: Icon(
                Icons.bookmark,
                color: Colors.white,
              )),
          IconButton(
            icon: Icon(
              Icons.keyboard_arrow_left,
              color: Colors.white,
            ),
            onPressed: () {
              _pdfViewerController.previousPage();
            },
          ),
          IconButton(
            icon: Icon(
              Icons.keyboard_arrow_right,
              color: Colors.white,
            ),
            onPressed: () {
              _pdfViewerController.nextPage();
            },
          )
        ],
      ),
      body: SfPdfViewer.network(
          'https://url/${widget.sid}',
          controller: _pdfViewerController,
          onDocumentLoaded: (PdfDocumentLoadedDetails details) {
            _pdfViewerController.jumpToPage(bookPage);
            print(details.document.pages.count);
          },
          key: _pdfViewerStateKey,
          onPageChanged: (PdfPageChangedDetails details) {
            setPage = details.newPageNumber;
          },
          pageLayoutMode: PdfPageLayoutMode.single),
    );
  }
}

I'm working on a PDF viewer, where I'm trying to store the last page a user read to Shared Preferences as the Book_Title id (tid). When the user resumes reading he's redirected to where he previously left off depending on each book.

The problem I'm facing is the shared Preferences is not being saved to each Book_title id. It's saving the last page to all the books

setInt(Book_title ID, setPage)

var book;
int bookPage = 1;
int setPage = 1;

  @override
  void initState() {
    book = '${widget.tid}';
    _pdfViewerController = PdfViewerController();
    getPref();
    super.initState();
  }

  getPref() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    prefs.setInt('${book}', setPage);
    bookPage = prefs.getInt('${book}')!;

    print(book);
  }

Full code

class libraryPDF extends StatefulWidget {
  final String? sid;
  final String? tid;
  final String? page;
  const libraryPDF({Key? key, this.sid, this.page, this.tid}) : super(key: key);

  @override
  State<libraryPDF> createState() => _libraryPDFState();
}

var book;
int bookPage = 1;
int setPage = 1;

class _libraryPDFState extends State<libraryPDF> {
  late PdfViewerController _pdfViewerController;
  final GlobalKey<SfPdfViewerState> _pdfViewerStateKey = GlobalKey();

  @override
  void initState() {
    book = '${widget.tid}';
    _pdfViewerController = PdfViewerController();
    getPref();
    super.initState();
  }

  getPref() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    await prefs.setInt('${book}', setPage);
    bookPage = await prefs.getInt('${book}')!;

    print(book);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        centerTitle: true,
        elevation: 0,
        title: const Text("CanadianHS"),
        backgroundColor: Colors.blue[900],
        actions: <Widget>[
          IconButton(
              onPressed: () {
                _pdfViewerStateKey.currentState!.openBookmarkView();
              },
              icon: Icon(
                Icons.bookmark,
                color: Colors.white,
              )),
          IconButton(
            icon: Icon(
              Icons.keyboard_arrow_left,
              color: Colors.white,
            ),
            onPressed: () {
              _pdfViewerController.previousPage();
            },
          ),
          IconButton(
            icon: Icon(
              Icons.keyboard_arrow_right,
              color: Colors.white,
            ),
            onPressed: () {
              _pdfViewerController.nextPage();
            },
          )
        ],
      ),
      body: SfPdfViewer.network(
          'https://url/${widget.sid}',
          controller: _pdfViewerController,
          onDocumentLoaded: (PdfDocumentLoadedDetails details) {
            _pdfViewerController.jumpToPage(bookPage);
            print(details.document.pages.count);
          },
          key: _pdfViewerStateKey,
          onPageChanged: (PdfPageChangedDetails details) {
            setPage = details.newPageNumber;
          },
          pageLayoutMode: PdfPageLayoutMode.single),
    );
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

还不是爱你 2025-02-10 02:56:19

好吧,在您的getPrefs中,在阅读当前书的页面之前,您 set it。您不想在一种称为 get prefs的方法中 set

只需从您的getPrefs方法中删除行prefs.setint('$ {book}',setPage);。那里还有很多其他错误,但这应该让您前进。

我建议打开并听您的 linter 。它将抓住很多问题,并为您提供有关如何改进代码的好提示。

Well, in your getPrefs before you read the page of the current book, you set it. You don't want to set the preferences in a method called getPrefs.

Just remove the line prefs.setInt('${book}', setPage); from your getPrefs method. There are a lot of other bugs in there, but that should get you going.

I suggest turning on and listening to your linter. It will catch a lot of what is wrong and give you good hints on how to improve your code.

策马西风 2025-02-10 02:56:19

您可以通过使用前缀键添加任何动态值来尝试此操作。

例如,

prefs.setInt("pageNo${bookId}", value);

You can try this by adding any dynamic values with the prefixed keys.

Such as,

prefs.setInt("pageNo${bookId}", value);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文