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

정충효님의 프로필 이미지

작성한 질문수

플러터 함수 실행에 대해 질문있습니다

해결된 질문

23.11.07 02:11 작성

·

188

·

수정됨

0

/// 마커 터치 동작과 아이콘 수정
  Future<Marker> Function(Cluster<Place>) _markerBuilder(BuildContext context) =>
      (cluster) async {
    
        return Marker(
          markerId: MarkerId(cluster.getId()),
          position: cluster.location,
          onTap: () async {
            cluster.items.forEach((element) {
              log("${element.plcaeId.toString()}");
            });
            log("${context} 컨텍스트");
            await locationWidgetUtil.buildShowModalBottomSheet(context!);
          },
          icon: await _locationUtil.getMarkerBitmap(
              cluster.isMultiple ? 125 : 77,
              text: cluster.isMultiple ? cluster.count.toString() : null),
        );

      };




  /// 근처 플레이스 검색해서 마커 겹치는 정도 컨트롤
  Future<void> initClusterManager(double lat, double lng) async {
    List<Place> placeCluster =
        await _locationUtil.nearSearchPlace(LatLng(lat, lng));
    log("${placeCluster.length} 길이입니다.");
    _clusterManager = ClusterManager<Place>(placeCluster, _updateMarkers,
        markerBuilder: _markerBuilder(_context!),
        levels: const [1, 4.25, 6.75, 8.25, 11, 14, 16, 17, 20.0]);
    log("${_clusterManager!.items.length}아이템 길이이므니다");
    notifyListeners();
  }

  /// 겹치는 마커 안겹치는 마커 다시 그리는 용도
  void _updateMarkers(Set<Marker> markers) {
    _markerList = markers;
    notifyListeners();
  }
var pl = Provider.of<LocationNotifier>(context,listen: false);
    await pl.getPosition();
    pl.setContext(context);
    await pl.initClusterManager(pl.current.latitude,pl.current.longitude);

아래 코드에서 pl.initClusterManager를 실행하면 정상적으로 _markerBuilder가 잘 실행되면서 다음 페이지로 넘어가는데 다시 pl.initClusterManager를 호출하면 _markerBuilder에 로그를 넣어보니 로그가 아예 실행이 안되는데 처음할 때는 실행이 되는데 한 번 더 입력하면 실행이 안되는지 이유를 모르겠습니다.

 

위에 코드는 Provider쪽 파일입니다.

답변 1

0

인프런 AI 인턴님의 프로필 이미지

2023. 11. 08. 02:16

안녕하세요 정충효님, 인프런 AI 인턴이에요.
현재 코드 상황에서 문제가 발생한 이유를 정확히 파악하기 위해서는 좀 더 상세한 정보가 필요합니다. 하지만 일반적으로 동일한 메서드가 처음에는 정상적으로 실행되지만, 두 번째 호출부터는 실행되지 않을 경우 다음과 같은 이유들을 확인해 볼 수 있습니다.

  1. initClusterManager가 한 번 실행된 상태에서 다시 호출될 때, 해당 메서드 내부에서 사용되는 변수들이 예상한 값과 다르게 설정되는 경우가 있을 수 있습니다. 변수들의 초기화나 조건문들을 확인해보시는 것이 좋습니다.

  2. initClusterManager가 실행될 때 같은 객체들이 반복적으로 생성되는 문제가 있을 수 있습니다. 이를 방지하기 위해서는 해당 객체들의 생성과 초기화를 적절한 위치에 배치해야 합니다.

  3. initClusterManager 메서드 내에서 await로 비동기 작업들이 수행되는데, 해당 비동기 작업이 예상하지 못한 에러를 발생시키거나 제대로 완료되지 않아 다음 호출 시에 영향을 줄 수 있습니다. 비동기 작업들을 주의깊게 검토하여 문제가 없는지 확인해보세요.

더 자세한 정보를 제공해주신다면 더 정확한 도움을 드릴 수 있을 것입니다. 감사합니다.