语境
我遇到了一个FutureBuilder
in Ffltter的问题,在每次小部件重建时,它都会重新创建Future
,导致我的应用程序出现意外行为.
具体地说,我有一个获取随机数的FutureBuilder
,但每次我触发重新构建(例如,通过按下按钮更新计数器)时,它都会生成一个新的随机数,而不是使用最初获取的值.
问题
当我试图通过按下按钮来更新计数器时,出现了这个问题.每按一次不仅更新计数器,also还会重新生成由FutureBuilder
显示的随机数.我希望保留第一个生成的随机数,除非显式刷新.
以下是问题的视频表示:
代码
以下是演示该问题的完整的可运行程序:
import 'package:flutter/material.dart';
import 'dart:math'; // For generating random numbers
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(Build语境 context) {
return const MaterialApp(
title: 'FutureBuilder Example',
home: FutureBuilderExample(),
);
}
}
class FutureBuilderExample extends StatefulWidget {
const FutureBuilderExample({super.key});
@override
_FutureBuilderExampleState createState() => _FutureBuilderExampleState();
}
class _FutureBuilderExampleState extends State<FutureBuilderExample> {
int counter = 0;
Future<int> fetchRandomNumber() async {
await Future.delayed(const Duration(milliseconds: 500));
return Random().nextInt(100);
}
@override
Widget build(Build语境 context) {
return Scaffold(
appBar: AppBar(title: const Text('FutureBuilder with Random Number')),
body: Column(
children: [
Text('Counter: $counter'),
FutureBuilder<int>(
future:
fetchRandomNumber(), // Future is recreated here on every build
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const Center(child: CircularProgressIndicator());
} else if (snapshot.hasError) {
return Center(child: Text('Error: ${snapshot.error}'));
} else {
return Center(child: Text('Random Number: ${snapshot.data}'));
}
},
),
],
),
floatingActionButton: FloatingActionButton(
onPressed: () {
setState(() {
counter++; // Triggering rebuild
});
},
child: const Icon(Icons.add),
),
);
}
}
问题
我正在寻找一种方法,防止FutureBuilder
人在每次重建时重新创造future .我怎样才能做到这一点呢?
此问题旨在作为解决FutureBuilder
和StreamBuilder
中类似问题的规范参考.