如何实现Flutter中无限滚动的Fibonacci数列列表?
解决Flutter无限滚动斐波那契数列问题
现有代码的问题分析
- 初始数列不匹配目标序列:当前
FibonacciNumbers的缓存初始值是{0:1,1:1},但你需要的目标序列是0,1,1,2...,初始值错误。 - ListView无法无限滚动:
itemCount设为numbers.cache.length,一开始只有2个元素,滚动时不会触发新数列的生成。 - 冗余Scaffold嵌套:
FibonacciListView里又套了一层Scaffold,导致界面出现两个AppBar,属于多余结构。 - 递归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
相关产品推荐
相关产品推荐

