使用 Dagger2 提供依赖

Ale*_*ndr 5 android google-maps dependency-injection dagger-2

我正在使用一个包装谷歌地图的(例子是假的,以简化问题,但本质保持不变),比如为 GoogleMap 装饰器,并有 MarkerManager 用于添加、删除标记等。

//图书馆

import com.google.android.gms.maps.GoogleMap;

public class DelegatingGoogleMap {

    GoogleMap map;
    MarkerManager manager;  

    public class DelegatingGoogleMap(GoogleMap map){
        this.map = map;
        this.manager = new MarkerManager(map);      
    }
}


import com.google.android.gms.maps.GoogleMap;

public class MarkerManager {

    public class GoogleMap map;

    public class MarkerManager(GoogleMap map) {
        this.map = map;
    }       
}
Run Code Online (Sandbox Code Playgroud)

在应用程序中我想使用自己的 MarkerManager's

//应用程序

public class MarkerManagerExtended extends MarkerManager {

    public class MarkerManager(GoogleMap map) {
        super(map);
    }

}
Run Code Online (Sandbox Code Playgroud)

所以我想使用 Dagger 2 将 MarkerManagerExtended 注入到 DelegatingGoogleMap(属性注入)。

public class DelegatingGoogleMap {

    GoogleMap map;

    @Inject
    MarkerManager manager;  

    public class DelegatingGoogleMap(GoogleMap map){
        this.map = map;
    }
} 
Run Code Online (Sandbox Code Playgroud)

不确定,在这种情况下使用的 Dagger 是个好主意。

问题是在Moduleto 提供了一个实例,MarkerManagerExtended我必须将 com.google.android.gms.maps.GoogleMap 传递给构造函数。

   @Module
   public class MapModule {
        @Provides
        public MarkerManager providesMarkerManager() {
              return new MarkerManagerExtended(map); //map instance of com.google.android.gms.maps.GoogleMap
        }
    } 
Run Code Online (Sandbox Code Playgroud)

获取 GoogleMaps 看起来并不容易,所以我不确定是否应该在Module.

    public class MapFragment extends com.google.android.gms.maps.SupportMapFragment {

        GoogleMap map;

        public void getMapAsync(final OnMapReadyCallback callback) {
            if (map != null) {
                callback.onMapReady(map);
            } else {
                getMapAsync(new OnMapReadyCallback() {
                    @Override
                    public void onMapReady(GoogleMap realMap) {
                        map = realMap;
                        callback.onMapReady(map);
                    }
                });
            }
        }   
    }

    FragmentManager fm = getChildFragmentManager();
    mapFragment = (SupportMapFragment) fm.findFragmentById(R.id.map);
Run Code Online (Sandbox Code Playgroud)

任何想法如何将 MarkerManager 注入 DelegatingGoogleMap?