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

如何实现Flutter中无限滚动的Fibonacci数列列表?

解决Flutter无限滚动斐波那契数列问题

现有代码的问题分析

  1. 初始数列不匹配目标序列:当前FibonacciNumbers的缓存初始值是{0:1,1:1},但你需要的目标序列是0,1,1,2...,初始值错误。
  2. ListView无法无限滚动:itemCount设为numbers.cache.length,一开始只有2个元素,滚动时不会触发新数列的生成。
  3. 冗余Scaffold嵌套:FibonacciListView里又套了一层Scaffold,导致界面出现两个AppBar,属于多余结构。
  4. 递归get方法存在栈溢出风险:当数列索引很大时,递归调用可能引发栈溢出问题。

修改后的完整代码

import 'package:flutter/material.dart';

void main() async {
  final numbers = FibonacciNumbers();

  runApp(
    MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Fibonacci List'),
        ),
        body: FibonacciListView(numbers),
      ),
    ),
  );
}

class FibonacciNumbers {
  final cache = {0: BigInt.from(0), 1: BigInt.from(1)};
  
  BigInt get(int i) {
    // 如果已缓存直接返回
    if (cache.containsKey(i)) {
      return cache[i]!;
    }
    
    // 从最后一个缓存的索引开始迭代计算,避免递归栈溢出
    int lastIndex = cache.keys.last;
    while (lastIndex < i) {
      final nextNumber = cache[lastIndex]! + cache[lastIndex - 1]!;
      lastIndex += 1;
      cache[lastIndex] = nextNumber;
    }
    
    return cache[i]!;
  }
}

class FibonacciListView extends StatelessWidget {
  final FibonacciNumbers numbers;
  const FibonacciListView(this.numbers, {super.key});
  
  @override
  Widget build(BuildContext context) {
    // 移除冗余的Scaffold,直接返回ListView
    return ListView.builder(
      // 不设置itemCount,让ListView支持无限滚动
      itemBuilder: (context, i) {
        final fibNumber = numbers.get(i);
        return ListTile(
          title: Text(fibNumber.toString()),
          onTap: () {
            final snack = SnackBar(
              content: Text('$fibNumber 是斐波那契数列的第 $i 项!'),
            );
            ScaffoldMessenger.of(context).showSnackBar(snack);
          },
        );
      },
    );
  }
}

关键修改说明

  • 修正初始数列:将cache初始值改为{0: BigInt.from(0), 1: BigInt.from(1)},确保第0项是0,第1项是1,完全匹配目标序列。
  • 实现无限滚动:移除ListView.builder的itemCount参数(默认值为null),ListView会在滚动时持续请求新的item,触发get(i)生成新的斐波那契数。
  • 移除冗余结构:删除FibonacciListView中的Scaffold,避免和main中的Scaffold嵌套导致的重复AppBar问题。
  • 优化数列生成逻辑:把递归的get方法改成迭代计算,从已缓存的最后一个索引开始逐步计算到目标索引,避免递归带来的栈溢出风险,同时保证缓存的有效性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 08:03:01