강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

Rei님의 프로필 이미지
Rei

작성한 질문수

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

fetchData 함수에서 Hive 적용 후 에러

해결된 질문

작성

·

748

1

강의 보면서 fetchData 함수에서 Hive로 변환 후 재시작했을 때

 

재시작 후 FutureBuilder 부분에서 snapshot.hasError에 걸려서 error를 화면에 출력해보니

 

The box "pm10" is already open and of type Box<Dynamic> 이라는 오류가 뜹니다.

 

그래서 강의처럼 정상적으로 앱이 작동되지 않고 에러가 있다는 화면이 나오는데 어떤 부분이 잘못되었는지 잘 모르겠습니다.

 

-----

Future<Map<ItemCode, List<StatModel>>> fetchData() async {
List<Future> futures = [];

for (ItemCode itemCode in ItemCode.values) {
futures.add(
StatRepository.fetchData(
itemCode: itemCode,
),
);
}

final results = await Future.wait(futures);

for (int i = 0; i < results.length; i++) {
// ItemCode
final key = ItemCode.values[i];
// List<StatModel>
final value = results[i];

final box = Hive.box<StatModel>(key.name);

for (StatModel stat in value) {
box.put(stat.dataTime.toString(), stat);
}
}

return ItemCode.values.fold<Map<ItemCode, List<StatModel>>>(
{},
(previousValue, itemCode) {
final box = Hive.box<StatModel>(itemCode.name);

previousValue.addAll({
itemCode: box.values.toList(),
});

return previousValue;
},
);
}

 

답변 2

1

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

안녕하세요! 제가 잠시 외부라 들어가면 확인 후 답변 드리도록 하겠습니다. 불편을 드려 죄송합니다!

1

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

안녕하세요 main.dart에서 Hive.openBox를 실행한 부분에 Hive.openBox<StatModel>로 타입 지정을 해주셨을까요?

현재 Hive.box에서는 박스를 사용할때 StatModel로 지정해서 Hive.box<StatModel>로 사용하는 중인데 열때는 Hive.openBox로 타입을 따로 지정하지 않으셔서 dynamic 타입으로 자동 매핑이돼서 생기는 에러로 보입니다!

Rei님의 프로필 이미지
Rei
질문자

예, 다음 강의까지 진행해서 확인해봤습니다만

이번에는 No element 라는 오류가 나타나네요...

Bad state: No element

 

The relevant error-causing widget was: 

  ValueListenableBuilder<Box<dynamic>> ValueListenableBuilder:file:///C:/Users/Unyeong/StudioProjects/flutter_install_test/lib/screen/home_screen.dart:78:12

When the exception was thrown, this was the stack: 

#0      List.last (dart:core-patch/growable_array.dart:365:5)

#1      _HomeScreenState.build.<anonymous closure> (package:flutter_install_test/screen/home_screen.dart:81:49)

#2      _ValueListenableBuilderState.build (package:flutter/src/widgets/value_listenable_builder.dart:187:26)

#3      StatefulElement.build (package:flutter/src/widgets/framework.dart:4870:27)

#4      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4754:15)

#5      StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4928:11)

#6      Element.rebuild (package:flutter/src/widgets/framework.dart:4477:5)

#7      StatefulElement.update (package:flutter/src/widgets/framework.dart:4960:5)

#8      Element.updateChild (package:flutter/src/widgets/framework.dart:3501:15)

#9      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4780:16)

#10     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4928:11)

#11     Element.rebuild (package:flutter/src/widgets/framework.dart:4477:5)

#12     BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2659:19)

#13     WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:882:21)

#14     RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:363:5)

#15     SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1144:15)

#16     SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1081:9)

#17     SchedulerBinding.scheduleWarmUpFrame.<anonymous closure> (package:flutter/src/scheduler/binding.dart:862:7)

(elided 4 frames from class _RawReceivePortImpl, class _Timer, and dart:async-patch)

 

 

문제가 되는 부분이 home_screen.dart의 

 

final recentStat = (box.values.toList().last as StatModel);

 

이 부분인데... home screen이랑 category_card, hourly_card에도 StatModel generic 지정해주니 이젠 no element라고만 뜨니까 

전혀 감을 못잡겠네요. ㅠ 죄송합니다.

https://github.com/BAEK-UNYEONG/dusty_dust

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

안녕하세요. 이건 제 잘못인것 같습니다. 버그 수정 영상을 만들었었는데 깜빡하고 업로드를 안했네요. 깃헙 링크 주신게 최신 버전이 아니신것같은데 최신 버전 푸쉬한 후 말씀주시면 제가 수정사항 알려드릴게요.

버그 수정 영상은 조만간 업로드하고 다시한번 알려드리도록 하겠습니다! 불편을드려 죄송합니다.

Rei님의 프로필 이미지
Rei
질문자

감사합니다. "update dusty_dust 0.4" 커밋 내역 확인해주시면 고맙겠습니다.

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

https://www.inflearn.com/course/%ED%94%8C%EB%9F%AC%ED%84%B0-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8/lecture/111854?tab=curriculum&volume=1.00

안녕하세요! 버그수정강의 마지막 강의에 추가했습니다! 확인해주시면 감사하겠습니다.

글로 추가 설명을 드리면

box.values.last를 실행하는 과정에서 만약에 데이터가 하나도 없는 상태라면 .last를 실행해서 마지막 값을 가져올 수 없기때문에 나는 에러입니다.

이 에러가 나는구간은 두곳으로 fetchData함수와 build 함수입니다. 이부분에 box.values.isEmpty 또는 box.values.isNotEmpty를 사용해서 값이 비어있을때 적절한 조건문을 작성해주면 해결할 수 있습니다.

조금만 더 오시면 이제 끝이시네요! 화이팅입니다!

Rei님의 프로필 이미지
Rei
질문자

빠른 피드백 반영에 놀랐습니다. 좋은 품질의 명강의를 올려주셔서 덕분에 Flutter 개발에 재미를 느끼고 있습니다. 앞으로도 좋은 강의 많이 올려주십시요. 감사합니다.

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

감사합니다!

Rei님의 프로필 이미지
Rei

작성한 질문수

질문하기