Lo que funcionó mejor para nosotros fue el uso de Inyección asistida.
Según el caso, definimos las fábricas de actividades en la actividad en sí, en un paquete (para desarrollar todas las actividades en ese paquete) o en el ActivityMapper.
public class MyActivity extends AbstractActivity {
private final MyView view;
@Inject
MyActivity(MyView view, @Assisted MyPlace place) {
this.view = view;
...
}
...
}
public class MyActivityMapper implements ActivityMapper {
public interface Factory {
MyActivity my(MyPlace place);
FooActivity foo(FooPlace place);
...
}
// using field injection here, feel free to replace by constructor injection
@Inject
private Factory factory;
@Overrides
public Activity getActivity(Place place) {
if (place instance MyPlace) {
return factory.my((MyPlace) place);
} else if (place instance FooPlace) {
return factory.foo((FooPlace) place);
}
...
}
}
// in the GinModule:
install(new GinFactoryModuleBuilder().build(MyActivityMapper.Factory.class));
Por cierto, para inyección método funcione, usted todavía tiene que crear sus actividades a través de GIN, por lo que tendría los mismos problemas que con la inyección de constructor. No hay magia, GIN no inyectará mágicamente clases de las que no tenga conocimiento y ni siquiera sepa cuándo se las ha instanciado. Puede desencadenar la inyección método de forma explícita mediante la adición de métodos para su Ginjector, pero yo no lo recomendaría (su código dependería de la Ginjector, que es algo que se debe evitar si es posible):
interface MyGinjector extends Ginjector {
// This will construct a Foo instance and inject its constructors, fields and methods
Foo foo();
// This will inject methods and (non-final) fields of an existing Bar instance
void whatever(Bar bar);
}
...
Bar bar = new Bar("some", "arguments");
myGinjector.whatever(bar);
...
Un último palabra: no pasaría el objeto de lugar directamente a la actividad. Intente desacoplar lugares y actividades, que le permitan mover cosas (por ejemplo, cree una versión para móvil o tableta, donde cambie entre vistas maestra y de detalles, en lugar de mostrarlas una al lado de la otra) simplemente cambiando su diseño de "caparazón" y su mapeadores de actividades. Para desacoplarlos realmente, tiene que construir algún tipo de navigator, que abstraerá sus llamadas placeController.goTo()
, de modo que sus actividades nunca se ocupen de lugares.
Hola Thomas, eso es exactamente lo que hacemos en nuestra aplicación (usando fábrica) y funciona bien. Sin embargo, ¿cómo sugeriría integrarlo con AsyncProvider de GIN para la división de código? (estamos usando ActivityAsyncProxy http://ars-codia.raphaelbauer.com/2011/04/gwt-gin-and-simple-split-points.html) –