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

求助:基于flip_widget实现JSON文本翻书式分页显示功能

Flutter 实现基于JSON数据的翻书效果(使用flip_widget)

步骤1:配置依赖与资源

在pubspec.yaml中添加flip_widget依赖,并配置你的JSON资源路径:

dependencies:
  flutter:
    sdk: flutter
  flip_widget: ^latest_version # 替换为包的最新版本

assets:
  - assets/your_book_data.json # 你的JSON文件路径

步骤2:读取并解析JSON数据

创建工具方法加载JSON,将数据解析为页面文本列表:

import 'dart:convert';
import 'package:flutter/services.dart';

Future<List<String>> loadBookPages() async {
  String jsonString = await rootBundle.loadString('assets/your_book_data.json');
  Map<String, dynamic> jsonData = json.decode(jsonString);
  // 假设JSON结构为 {"pages": ["第一页内容", "第二页内容", ...]}
  return List<String>.from(jsonData['pages']);
}

步骤3:实现翻书核心逻辑

使用FlipWidget构建翻书界面,管理当前页码,切换页面时更新显示内容:

import 'package:flutter/material.dart';
import 'package:flip_widget/flip_widget.dart';

class BookFlipPage extends StatefulWidget {
  const BookFlipPage({super.key});

  @override
  State<BookFlipPage> createState() => _BookFlipPageState();
}

class _BookFlipPageState extends State<BookFlipPage> {
  late List<String> _pages;
  int _currentPageIndex = 0;
  bool _isLoading = true;

  @override
  void initState() {
    super.initState();
    _loadBookData();
  }

  void _loadBookData() async {
    _pages = await loadBookPages();
    setState(() => _isLoading = false);
  }

  void _flipToNextPage() {
    if (_currentPageIndex < _pages.length - 1) {
      setState(() => _currentPageIndex++);
    }
  }

  void _flipToPreviousPage() {
    if (_currentPageIndex > 0) {
      setState(() => _currentPageIndex--);
    }
  }

  @override
  Widget build(BuildContext context) {
    if (_isLoading) {
      return const Scaffold(body: Center(child: CircularProgressIndicator()));
    }

    return Scaffold(
      appBar: AppBar(title: const Text('翻书效果')),
      body: Center(
        child: FlipWidget(
          frontWidget: _buildPage(_currentPageIndex),
          backWidget: _currentPageIndex < _pages.length - 1 
              ? _buildPage(_currentPageIndex + 1) 
              : _buildPage(_currentPageIndex), // 最后一页不触发新内容翻转
          onFlipCompleted: (isFront) {
            if (!isFront) _flipToNextPage();
          },
          flipDirection: FlipDirection.HORIZONTAL,
        ),
      ),
      bottomNavigationBar: BottomAppBar(
        child: Row(
          mainAxisAlignment: MainAxisAlignment.spaceAround,
          children: [
            IconButton(
              icon: const Icon(Icons.arrow_back),
              onPressed: _flipToPreviousPage,
            ),
            Text('第 ${_currentPageIndex + 1}/${_pages.length} 页'),
            IconButton(
              icon: const Icon(Icons.arrow_forward),
              onPressed: _flipToNextPage,
            ),
          ],
        ),
      ),
    );
  }

  Widget _buildPage(int index) {
    return Container(
      width: MediaQuery.of(context).size.width * 0.8,
      height: MediaQuery.of(context).size.height * 0.7,
      padding: const EdgeInsets.all(20),
      decoration: BoxDecoration(
        color: Colors.white,
        borderRadius: BorderRadius.circular(10),
        boxShadow: const [BoxShadow(color: Colors.grey, blurRadius: 5)],
      ),
      child: SingleChildScrollView(
        child: Text(
          _pages[index],
          style: const TextStyle(fontSize: 16, height: 1.5),
        ),
      ),
    );
  }
}

说明

  • JSON文件保持原结构不变,仅通过解析将内容拆分为页面列表
  • 翻转动画由flip_widget包提供,支持水平翻转方向
  • 底部导航栏提供页码显示与前后页切换按钮,也可通过点击页面触发翻转

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 18:22:57