Derniers messages sur Zeste de Savoirhttps://zestedesavoir.com/forums/2017-03-04T14:53:39+01:00Les derniers messages parus sur le forum de Zeste de Savoir.Utilisation des nouvelles classes utilitaires pour Android dans la nouvelle version de Dagger, message #1433362017-03-04T14:53:39+01:00Hugo/@Hugohttps://zestedesavoir.com/forums/sujet/8137/utilisation-des-nouvelles-classes-utilitaires-pour-android-dans-la-nouvelle-version-de-dagger/?page=1#p143336<p>Bonjour,</p>
<p>Depuis quelques jours, une nouvelle version de Dagger est en "release candidate", c’est la version 2.10.
Dans le changelog, on peut voir <a href="https://guides.codepath.com/android/Dependency-Injection-with-Dagger-2">"Release of dagger.android classes to simplify injection of Android core types"</a>. Une <a href="https://google.github.io/dagger/android.html">nouvelle section</a> dans la documentation est apparue.</p>
<p>La nouvelle release permettrait de « simplifier », l’injection des dépendances dans les activité et les fragments. De plus, selon eux, cela a un autre avantage, ne plus avoir à préciser comment la classe injecté, l’est ("a class shouldn’t know anything about how it is injected."). Enfin, selon BG_NE sur <a href="https://www.reddit.com/r/androiddev/comments/5w0d4j/dagger_2_updates_specifically_for_android/de7bvxz/">Reddit</a>, on pourrait plus facilement remplacer les dépendences des activités (pas sur d’avoir compris son commentaire, si quelqu’un pouvait expliquer un peu plus longuement ?!).</p>
<p>Maintenant dans les faits, c’est beaucoup plus compliqué <img alt=":p" src="/static/smileys/langue.png"> !</p>
<p><strong>Avant cette release</strong></p>
<p>Pour injecter mon presenter dans mon activité, j’avais pour chaque activité, un module et un component, définit comme cela:</p>
<p>Module, injection de la vue au presenter:</p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11</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">ListNewsPresenterModule</span> <span class="o">{</span>
<span class="kd">private</span> <span class="kd">final</span> <span class="n">ListNewsContract</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">ListNewsPresenterModule</span><span class="o">(</span><span class="n">ListNewsContract</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">ListNewsContract</span><span class="o">.</span><span class="na">View</span> <span class="nf">provideListNewsContractView</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></div>
<p>puis un component, </p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4
5
6</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">DataSourceComponent</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">ListNewsPresenterModule</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">ListNewsComponent</span> <span class="o">{</span>
<span class="kt">void</span> <span class="nf">inject</span><span class="o">(</span><span class="n">ListNewsActivity</span> <span class="n">activity</span><span class="o">);</span>
<span class="o">}</span>
</pre></div>
</td></tr></table></div>
<p>enfin, il était injecté comme cela dans mon activité :</p>
<div><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="kd">public</span> <span class="kd">class</span> <span class="nc">ListNewsActivity</span> <span class="kd">extends</span> <span class="n">BaseActivity</span> <span class="o">{</span>
<span class="nd">@Inject</span> <span class="n">ListNewsPresenter</span> <span class="n">mPresenter</span><span class="o">;</span>
<span class="nd">@Override</span>
<span class="kd">protected</span> <span class="kt">void</span> <span class="nf">onCreate</span><span class="o">(</span><span class="n">Bundle</span> <span class="n">savedInstanceState</span><span class="o">)</span> <span class="o">{</span>
<span class="kd">super</span><span class="o">.</span><span class="na">onCreate</span><span class="o">(</span><span class="n">savedInstanceState</span><span class="o">);</span>
<span class="c1">// Create the presenter</span>
<span class="n">DaggerStripComponent</span><span class="o">.</span><span class="na">builder</span><span class="o">()</span>
<span class="o">.</span><span class="na">dataSourceComponent</span><span class="o">(</span><span class="n">MonSingleton</span><span class="o">.</span><span class="na">getInstance</span><span class="o">(</span><span class="n">context</span><span class="o">).</span><span class="na">getDataSourceComponent</span><span class="o">())</span>
<span class="o">.</span><span class="na">displayStripPresenterModule</span><span class="o">(</span>
<span class="k">new</span> <span class="n">ListNewsPresenterModule</span><span class="o">(</span><span class="n">mFragment</span><span class="o">)).</span><span class="na">build</span><span class="o">()</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></div>
<p>Presenter</p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4
5
6
7</pre></div></td><td class="code"><div class="codehilite"><pre><span></span> <span class="nd">@Inject</span>
<span class="kd">public</span> <span class="nf">ListNewsPresenter</span><span class="o">(</span><span class="n">StripRepository</span> <span class="n">stripRepository</span><span class="o">,</span> <span class="n">ListNewsContract</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">mStripRepository</span> <span class="o">=</span> <span class="n">stripRepository</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="n">mView</span><span class="o">.</span><span class="na">setPresenter</span><span class="o">(</span><span class="k">this</span><span class="o">);</span> <span class="c1">// Envoi du presenter dans le fragment. </span>
<span class="o">}</span>
</pre></div>
</td></tr></table></div>
<p><strong>Après cette release</strong></p>
<p>Dans mon activité, j’ai plus que ça : </p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4
5
6
7</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="kd">public</span> <span class="kd">class</span> <span class="nc">ListNewsActivity</span> <span class="kd">extends</span> <span class="n">BaseActivity</span> <span class="o">{</span>
<span class="nd">@Inject</span> <span class="n">ListNewsPresenter</span> <span class="n">mPresenter</span><span class="o">;</span>
<span class="nd">@Override</span>
<span class="kd">protected</span> <span class="kt">void</span> <span class="nf">onCreate</span><span class="o">(</span><span class="n">Bundle</span> <span class="n">savedInstanceState</span><span class="o">)</span> <span class="o">{</span>
<span class="n">AndroidInjection</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></div>
<p>Pour chaque activité, j’ai un module et un subcomponent.</p>
<p>Module : </p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4
5
6
7
8
9</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="nd">@Module</span><span class="o">(</span><span class="n">subcomponents</span> <span class="o">=</span> <span class="n">YourActivitySubcomponent</span><span class="o">.</span><span class="na">class</span><span class="o">)</span>
<span class="kd">public</span> <span class="kd">abstract</span> <span class="kd">class</span> <span class="nc">YourActivityModule</span> <span class="o">{</span>
<span class="nd">@Binds</span>
<span class="nd">@IntoMap</span>
<span class="nd">@ActivityKey</span><span class="o">(</span><span class="n">ListNewsActivity</span><span class="o">.</span><span class="na">class</span><span class="o">)</span>
<span class="kd">abstract</span> <span class="n">AndroidInjector</span><span class="o">.</span><span class="na">Factory</span><span class="o"><?</span> <span class="kd">extends</span> <span class="n">Activity</span><span class="o">></span>
<span class="nf">bindYourActivityInjectorFactory</span><span class="o">(</span><span class="n">YourActivitySubcomponent</span><span class="o">.</span><span class="na">Builder</span> <span class="n">builder</span><span class="o">);</span>
<span class="o">}</span>
</pre></div>
</td></tr></table></div>
<p>un subcomponent, </p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4
5
6</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="nd">@Subcomponent</span><span class="o">()</span>
<span class="kd">public</span> <span class="kd">interface</span> <span class="nc">YourActivitySubcomponent</span> <span class="kd">extends</span> <span class="n">AndroidInjector</span><span class="o"><</span><span class="n">CacheActivity</span><span class="o">></span> <span class="o">{</span>
<span class="nd">@Subcomponent.Builder</span>
<span class="kd">public</span> <span class="kd">abstract</span> <span class="kd">class</span> <span class="nc">Builder</span> <span class="kd">extends</span> <span class="n">AndroidInjector</span><span class="o">.</span><span class="na">Builder</span><span class="o"><</span><span class="n">CacheActivity</span><span class="o">></span> <span class="o">{}</span>
<span class="o">}</span>
</pre></div>
</td></tr></table></div>
<p>J’ai du changer mon AppComponent qui est initialisé dans la classe Application d’Android.</p>
<div><table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4
5
6
7</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="nd">@Component</span><span class="o">(</span>
<span class="n">dependencies</span> <span class="o">=</span> <span class="o">{</span><span class="n">DataSourceComponent</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="o">{</span><span class="n">AndroidInjectionModule</span><span class="o">.</span><span class="na">class</span><span class="o">,</span> <span class="n">YourActivityModule</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">MyAppComponent</span> <span class="o">{</span>
<span class="kt">void</span> <span class="nf">inject</span> <span class="o">(</span><span class="n">MyApp</span> <span class="n">app</span><span class="o">);</span>
<span class="o">}</span>
</pre></div>
</td></tr></table></div>
<p>et enfin ma classe, Application, </p>
<div><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="kd">public</span> <span class="kd">class</span> <span class="nc">MyApp</span> <span class="kd">extends</span> <span class="n">Application</span> <span class="kd">implements</span> <span class="n">HasDispatchingActivityInjector</span> <span class="o">{</span>
<span class="nd">@Inject</span>
<span class="n">DispatchingAndroidInjector</span><span class="o"><</span><span class="n">Activity</span><span class="o">></span> <span class="n">dispatchingActivityInjector</span><span class="o">;</span>
</pre></div>
</td></tr></table></div>
<p>Mon souci, c’est que mon presenter à besoin d’accéder à ma vue (l’activite) et je vois pas comment faire, vu que je peux rien passer au <code>AndroidInjection.inject(this)</code>. </p>
<p>Merci d’avance.</p>