2017-03-01 97 views
0

像下面這樣:如何在dagger2中傳遞參數?

public class MainActivity extends Activity { 
@Inject 
User mUser1; 
@Inject 
User mUser2; 
@Inject 
User mUser3; 

protected void onCreate(@Nullable Bundle savedInstanceState) { 
    // how to inject ... 
    ...... 
    Log.d("XXX",mUser1.getName()); 
    Log.d("XXX",mUser2.getName()); 
    Log.d("XXX",mUser3.getName()); 
} 

}

public class User { 
private final String name; 
public User (String name) { 
    this.name = name; 
} 
public String getName() { 
    return name; 
} 

}

@Module 
public class MainModule { 
@Provides 
User providesUser(String name) { 
    return new User(name); 
} 
@Provides 
String providesUser() { 
    return "Jack"; 
} 

}

@Component(modules = MainModule .class) 
public interface ChildComponent { 
void inject(MainActivity activity); 

}

上面的代碼中,只有創建具有相同名稱的三個用戶對象,但我想有差異的名字創建

我嘗試使用「@Qualifier」,但它只是區分構造,不能將name參數

我嘗試這MainModule.java:

@Named("Yuri") 
@Provides 
User providesUser() { 
    return new User("yuri"); 
} 

@Named("Warren") 
@Provides 
User providesUser() { 
    return new User("warren"); 
} 

@Named("Jack") 
@Provides 
User providesUser() { 
    return new User("Jack"); 
} 

但這種方法 'providesUser' 已定義。

名稱參數是最終的,不能修改

如何把這個情況來處理!

+0

你想要的是一個'UserFactory',這可能需要一個參數'名'並返回一個完全注入的'User'實例,並在注入的依賴關係旁邊提供該'name'。這個概念在Guice被稱爲「輔助注射」我標記爲這個問題的重複:[我可以使用某種輔助注入匕首?](http://stackoverflow.com/questions/29175014/can-i-use-some-kind-of-assisted -inject-with-dagger) –

+0

我不明白。 意思是使用新庫'Guice'? 避免使用這種方式? –

+0

Guice是一個較老的依賴注入框架,它與Dagger有些相關。術語「輔助注射」對於使用Guice的人來說是已知的,但是如果你開始使用Dagger,可能不清楚。無論如何,你問的問題與我鏈接的問題相同。 –

回答

0

方法名稱無關緊要。只有返回類型是重要的。所以:

@Named("Yuri") 
@Provides 
User providesUserYuri() { 
    return new User("yuri"); 
} 

@Named("Warren") 
@Provides 
User providesUserWarren() { 
    return new User("warren"); 
} 

@Named("Jack") 
@Provides 
User providesUserJack() { 
    return new User("Jack"); 
} 
0

如果你想有一個動態名稱關聯,不使用@Qualifier,這些都只是爲@Providers參數做出鑑別。 只需使用Java POJO對象。現在
User類將是這樣的:

public class User { 

    private String name; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

現在您的Activity,你可以這樣說:

@Override 
protected void onPostCreate(@Nullable Bundle savedInstanceState) { 
    super.onPostCreate(savedInstanceState); 
    user1.setName("Ali"); 
    user2.setName("Hossein"); 
    user3.setName("Reza"); 

    Log.d(TAG, user1.getName()); 
    Log.d(TAG, user2.getName()); 
    Log.d(TAG, user3.getName()); 
}