Derniers messages sur Zeste de Savoirhttps://zestedesavoir.com/forums/2016-06-25T02:18:01+02:00Les derniers messages parus sur le forum de Zeste de Savoir.Dagger 2 et le pattern mvp sous Android, message #1155592016-06-25T02:18:01+02:00Hugo/@Hugohttps://zestedesavoir.com/forums/sujet/6360/dagger-2-et-le-pattern-mvp-sous-android/?page=1#p115559<p>Désolé, j'ai pas pris le temps de répondre mais c'était un peu compliqué de prendre ce temps là.</p>
<p>Je parlais effectivement de sa déclaration, j'ai l’impression de lui dire deux fois que mon netModule, correspond à cet instance de NetModule. J'aurais aimé que sa soit optionnel et que si tu le déclare un jour, Dagger 2 soit capable de se dire « tiens il veut une instance de Retrofit et j'ai déjà ça dans mon catalogue » surtout quand c'est un <code>@Singleton</code>. </p>
<p>Je crois que je cherchais fonctionnellement un truc comme <a href="https://github.com/google/guice/wiki/Motivation">guice</a> mais bon apparemment Google ne recommande <a href="https://developer.android.com/training/articles/memory.html#DependencyInjection">pas</a>.</p>Dagger 2 et le pattern mvp sous Android, message #1147612016-06-20T09:04:05+02:00Andr0/@Andr0https://zestedesavoir.com/forums/sujet/6360/dagger-2-et-le-pattern-mvp-sous-android/?page=1#p114761<p>Salut Hugo,</p>
<p>Malheureusement, je ne connais que Dagger de Square. Cela dit, à la lecture de ton message et de ton problème, je ne comprends pas ce qui te chipote. Quand tu dis que tu ne comprends pas pourquoi tu de <strong>re</strong>-préciser ton netComponent, où est-ce que tu le précises autre part ? Tu parles de sa déclaration ?</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="n">mNetComponent</span> <span class="o">=</span> <span class="n">DaggerNetComponent</span><span class="o">.</span><span class="na">builder</span><span class="o">()</span>
<span class="o">.</span><span class="na">appModule</span><span class="o">(</span><span class="k">new</span> <span class="n">AppModule</span><span class="o">(</span><span class="k">this</span><span class="o">))</span>
<span class="o">.</span><span class="na">netModule</span><span class="o">(</span><span class="k">new</span> <span class="n">NetModule</span><span class="o">(</span><span class="n">Configuration</span><span class="o">.</span><span class="na">url</span><span class="o">))</span>
<span class="o">.</span><span class="na">build</span><span class="o">();</span>
</pre></div>
</td></tr></table>Dagger 2 et le pattern mvp sous Android, message #1146872016-06-19T16:15:59+02:00Hugo/@Hugohttps://zestedesavoir.com/forums/sujet/6360/dagger-2-et-le-pattern-mvp-sous-android/?page=1#p114687<p>Bonjour,</p>
<p><strong>Contexte</strong> </p>
<p>Je souhaitais mettre en place une architecture mvp pour une application Android. Pour cela, je comptais utiliser une libraire d'injection de dépendances pour injecter ma <code>views</code> dans mon presenter. Pour cela, j'ai créé un module, un component et une annotation <code>FragmentScoped</code>.
Dans mon <code>presenter</code>, j'ai eu besoin de la librairie Retrofit pour faire des requêtes HTTP (normalement ce code devrait être dans le model, mais pour la simplicité, j'ai fait comme ça, temporairement). </p>
<p>Donc mon code ressemble à ça pour l'instant:</p>
<p><strong>La partie Retrofit:</strong></p>
<p>Module :</p>
<div class="spoiler">
<p><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="nd">@Module</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">NetModule</span> <span class="o">{</span>
<span class="n">String</span> <span class="n">mBaseUrl</span><span class="o">;</span>
<span class="c1">// Constructor needs one parameter to instantiate.</span>
<span class="kd">public</span> <span class="nf">NetModule</span><span class="o">(</span><span class="n">String</span> <span class="n">baseUrl</span><span class="o">)</span> <span class="o">{</span>
<span class="k">this</span><span class="o">.</span><span class="na">mBaseUrl</span> <span class="o">=</span> <span class="n">baseUrl</span><span class="o">;</span>
<span class="o">}</span>
<span class="c1">// Dagger will only look for methods annotated with @Provides</span>
<span class="nd">@Provides</span>
<span class="nd">@Singleton</span>
<span class="c1">// Application reference must come from org.esiag.isinthefuture.crmandroid.dagger.module.AppModule.class</span>
<span class="n">SharedPreferences</span> <span class="nf">providesSharedPreferences</span><span class="o">(</span><span class="n">Application</span> <span class="n">application</span><span class="o">)</span> <span class="o">{</span>
<span class="k">return</span> <span class="n">PreferenceManager</span><span class="o">.</span><span class="na">getDefaultSharedPreferences</span><span class="o">(</span><span class="n">application</span><span class="o">);</span>
<span class="o">}</span>
<span class="nd">@Provides</span>
<span class="nd">@Singleton</span>
<span class="n">Cache</span> <span class="nf">provideOkHttpCache</span><span class="o">(</span><span class="n">Application</span> <span class="n">application</span><span class="o">)</span> <span class="o">{</span>
<span class="kt">int</span> <span class="n">cacheSize</span> <span class="o">=</span> <span class="mi">10</span> <span class="o">*</span> <span class="mi">1024</span> <span class="o">*</span> <span class="mi">1024</span><span class="o">;</span> <span class="c1">// 10 MiB</span>
<span class="n">Cache</span> <span class="n">cache</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Cache</span><span class="o">(</span><span class="n">application</span><span class="o">.</span><span class="na">getCacheDir</span><span class="o">(),</span> <span class="n">cacheSize</span><span class="o">);</span>
<span class="k">return</span> <span class="n">cache</span><span class="o">;</span>
<span class="o">}</span>
<span class="nd">@Provides</span>
<span class="nd">@Singleton</span>
<span class="n">Gson</span> <span class="nf">provideGson</span><span class="o">()</span> <span class="o">{</span>
<span class="n">GsonBuilder</span> <span class="n">gsonBuilder</span> <span class="o">=</span> <span class="k">new</span> <span class="n">GsonBuilder</span><span class="o">();</span>
<span class="n">gsonBuilder</span><span class="o">.</span><span class="na">setFieldNamingPolicy</span><span class="o">(</span><span class="n">FieldNamingPolicy</span><span class="o">.</span><span class="na">LOWER_CASE_WITH_UNDERSCORES</span><span class="o">);</span>
<span class="k">return</span> <span class="n">gsonBuilder</span><span class="o">.</span><span class="na">create</span><span class="o">();</span>
<span class="o">}</span>
<span class="nd">@Provides</span>
<span class="nd">@Singleton</span>
<span class="n">OkHttpClient</span> <span class="nf">provideOkHttpClient</span><span class="o">(</span><span class="n">Cache</span> <span class="n">cache</span><span class="o">)</span> <span class="o">{</span>
<span class="n">OkHttpClient</span> <span class="n">client</span> <span class="o">=</span> <span class="k">new</span> <span class="n">OkHttpClient</span><span class="o">();</span>
<span class="n">client</span><span class="o">.</span><span class="na">setCache</span><span class="o">(</span><span class="n">cache</span><span class="o">);</span>
<span class="k">return</span> <span class="n">client</span><span class="o">;</span>
<span class="o">}</span>
<span class="nd">@Provides</span>
<span class="nd">@Singleton</span>
<span class="n">Retrofit</span> <span class="nf">provideRetrofit</span><span class="o">(</span><span class="n">Gson</span> <span class="n">gson</span><span class="o">,</span> <span class="n">OkHttpClient</span> <span class="n">okHttpClient</span><span class="o">)</span> <span class="o">{</span>
<span class="n">Retrofit</span> <span class="n">retrofit</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Retrofit</span><span class="o">.</span><span class="na">Builder</span><span class="o">()</span>
<span class="o">.</span><span class="na">addConverterFactory</span><span class="o">(</span><span class="n">GsonConverterFactory</span><span class="o">.</span><span class="na">create</span><span class="o">(</span><span class="n">gson</span><span class="o">))</span>
<span class="o">.</span><span class="na">baseUrl</span><span class="o">(</span><span class="n">mBaseUrl</span><span class="o">)</span>
<span class="o">.</span><span class="na">client</span><span class="o">(</span><span class="n">okHttpClient</span><span class="o">)</span>
<span class="o">.</span><span class="na">build</span><span class="o">();</span>
<span class="k">return</span> <span class="n">retrofit</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">}</span>
</pre></div>
</td></tr></table>
</p>
</div>
<p>Le component : </p>
<div class="spoiler">
<p><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4
5</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="nd">@Singleton</span>
<span class="nd">@Component</span><span class="o">(</span><span class="n">modules</span><span class="o">={</span><span class="n">AppModule</span><span class="o">.</span><span class="na">class</span><span class="o">,</span> <span class="n">NetModule</span><span class="o">.</span><span class="na">class</span><span class="o">})</span>
<span class="kd">public</span> <span class="kd">interface</span> <span class="nc">NetComponent</span> <span class="o">{</span>
<span class="n">Retrofit</span> <span class="nf">retrofit</span><span class="o">();</span>
<span class="o">}</span>
</pre></div>
</td></tr></table>
</p>
</div>
<p>et dans le MyApplication qui étend la classe <code>Application</code> d'Android : </p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4
5</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="c1">// Dagger</span>
<span class="n">mNetComponent</span> <span class="o">=</span> <span class="n">DaggerNetComponent</span><span class="o">.</span><span class="na">builder</span><span class="o">()</span>
<span class="o">.</span><span class="na">appModule</span><span class="o">(</span><span class="k">new</span> <span class="n">AppModule</span><span class="o">(</span><span class="k">this</span><span class="o">))</span>
<span class="o">.</span><span class="na">netModule</span><span class="o">(</span><span class="k">new</span> <span class="n">NetModule</span><span class="o">(</span><span class="n">Configuration</span><span class="o">.</span><span class="na">url</span><span class="o">))</span>
<span class="o">.</span><span class="na">build</span><span class="o">();</span>
</pre></div>
</td></tr></table>
<p><strong>La partie MVP</strong></p>
<p>Le module permettant d'injecter la vue : </p>
<div class="spoiler">
<p><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="nd">@Module</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">MyModule</span> <span class="o">{</span>
<span class="kd">private</span> <span class="kd">final</span> <span class="n">MyContract</span><span class="o">.</span><span class="na">View</span> <span class="n">mView</span><span class="o">;</span>
<span class="kd">public</span> <span class="nf">MyModule</span><span class="o">(</span><span class="n">MyContract</span><span class="o">.</span><span class="na">View</span> <span class="n">view</span><span class="o">)</span> <span class="o">{</span>
<span class="n">mView</span> <span class="o">=</span> <span class="n">view</span><span class="o">;</span>
<span class="o">}</span>
<span class="nd">@Provides</span>
<span class="n">MyContract</span><span class="o">.</span><span class="na">View</span> <span class="nf">provideView</span><span class="o">()</span> <span class="o">{</span>
<span class="k">return</span> <span class="n">mView</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">}</span>
</pre></div>
</td></tr></table>
</p>
</div>
<p>Le component :</p>
<div class="spoiler">
<p><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4
5</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="nd">@FragmentScoped</span>
<span class="nd">@Component</span><span class="o">(</span><span class="n">dependencies</span> <span class="o">=</span> <span class="n">NetComponent</span><span class="o">.</span><span class="na">class</span><span class="o">,</span> <span class="n">modules</span> <span class="o">=</span> <span class="n">MyModule</span><span class="o">.</span><span class="na">class</span><span class="o">)</span>
<span class="kd">public</span> <span class="kd">interface</span> <span class="nc">MyComponent</span> <span class="o">{</span>
<span class="kt">void</span> <span class="nf">inject</span><span class="o">(</span><span class="n">MyFragment</span> <span class="n">fragment</span><span class="o">);</span>
<span class="o">}</span>
</pre></div>
</td></tr></table>
</p>
</div>
<p>Mon presenter : </p>
<div class="spoiler">
<p><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4
5</pre></div></td><td class="code"><div class="codehilite"><pre><span></span> <span class="nd">@Inject</span>
<span class="n">MyPresenter</span><span class="o">(</span><span class="n">Retrofit</span> <span class="n">retrofit</span><span class="o">,</span> <span class="n">MyContrat</span><span class="o">.</span><span class="na">View</span> <span class="n">myView</span><span class="o">)</span> <span class="o">{</span>
<span class="k">this</span><span class="o">.</span><span class="na">retrofit</span> <span class="o">=</span> <span class="n">retrofit</span><span class="o">;</span>
<span class="k">this</span><span class="o">.</span><span class="na">myView</span> <span class="o">=</span> <span class="n">myView</span><span class="o">;</span>
<span class="o">}</span>
</pre></div>
</td></tr></table>
</p>
</div>
<p>Et le fragment : </p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4</pre></div></td><td class="code"><div class="codehilite"><pre><span></span> <span class="n">DaggerMyComponent</span><span class="o">.</span><span class="na">builder</span><span class="o">()</span>
<span class="o">.</span><span class="na">netComponent</span><span class="o">(((</span><span class="n">MyApp</span><span class="o">)</span> <span class="n">getActivity</span><span class="o">().</span><span class="na">getApplication</span><span class="o">()).</span><span class="na">getNetComponent</span><span class="o">())</span>
<span class="o">.</span><span class="na">MyModule</span><span class="o">(</span><span class="k">new</span> <span class="n">MyModule</span><span class="o">(</span><span class="k">this</span><span class="o">))</span>
<span class="o">.</span><span class="na">build</span><span class="o">().</span><span class="na">inject</span><span class="o">(</span><span class="k">this</span><span class="o">);</span>
</pre></div>
</td></tr></table>
<p>Tout marche bien dans le meilleur des monde, mais la deuxième ligne de mon fragment (qui semble indispensable) me surprend, pourquoi suis-je obligé de re-préciser mon netComponent alors que l'ai déjà fait dans ma classe MyApplication ? Y'a t-il pas un autre moyen de faire pour éviter cette répétition.</p>
<p>Merci d'avance.</p>