일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 2D 그래픽 라이브러리
- 배움순서
- 안드로이드를 위한
- 플러터
- pubspec.yaml
- 객체 지향 설계
- Same parameter
- TDD 개발 방법론
- 플러터 테스트
- 에러 메시지를 잘보자 ^^
- refresh 토큰
- permission_handler
- 테스트 주도 개발론
- Android
- 2D graphics library
- 인코딩방지
- dart
- widget test
- Flutter
- dart test
- 8시간 삽질
- 안드로이드
- pubspec
- SOLID 원칙
- 토큰갱신
- retorift
- Refresh Tocken
- 다트 테스트
- 다트
- Parameter specified as non-null is null
Archives
- Today
- Total
Landroid
FutureBuilder에서 future 함수 중복 호출 방지 본문
Future 함수를 Future Builder를 통해 호출하시는 경우가 있습니다.
하지만 정작 실행해보면 함수에서 호출될 값까지 가져오기 까지 여러번 호출되는 것을 보실 수 있습니다.
이는 자원 낭비로 이어질 수 있기 때문에
가능하면 해결하시는 것이 좋습니다.
Future Builder에서 함수를 중복 호출 방지하는 방법이 2가지 있습니다.
하나는 initState로 Future 함수를 변수에 저장하는 방법입니다.
class FutureSample extends StatefulWidget {
// Create instance variable
@override
_FutureSampleState createState() => _FutureSampleState();
}
class _FutureSampleState extends State<FutureSample> {
Future myFuture;
Future<String> _fetchData() async {
await Future.delayed(Duration(seconds: 10));
return 'DATA';
}
@override
void initState() {
// assign this variable your Future
myFuture = _fetchData();
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: Center(
child: FutureBuilder(
future: myFuture,
builder: (ctx, snapshot) {
if (snapshot.hasData) {
return Text(snapshot.data.toString());
}
return CircularProgressIndicator();
},
),
),
);
}
}
두번째 방법은 AsyncMemoizer를 사용하는 방법입니다.
class MemoizerSample extends StatefulWidget {
@override
_MemoizerSampleState createState() => _MemoizerSampleState();
}
class _MemoizerSampleState extends State<MemoizerSample> {
AsyncMemoizer _memoizer;
_fetchData() async {
return this._memoizer.runOnce(() async { // This below code will call only ones. This will return the same data directly without performing any Future task.
await Future.delayed(Duration(seconds: 10));
return 'DATA';
});
}
@override
void initState() {
super.initState();
_memoizer = AsyncMemoizer();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: Center(
child: FutureBuilder(
future: _fetchData(),
builder: (ctx, snapshot) {
if (snapshot.hasData) {
return Text(snapshot.data.toString());
}
return CircularProgressIndicator();
},
),
),
);
}
}
이와 관련된 영상도 있으니 참고하시길
'플러터' 카테고리의 다른 글
[Flutter] State와 StatefulWidget을 분리한 이유 (3) | 2021.04.07 |
---|---|
[Flutter] 플러터 프로젝트에 .gitignore 추가하기 (1) | 2021.03.10 |
[Flutter] Skia가 뭐지? (0) | 2021.01.15 |
[플러터] 테스트 (0) | 2021.01.09 |
[플러터] 헷갈리는 권한 정리(with permission_handler) (0) | 2020.12.22 |
Comments