Dagger 2注入注释打破了注射

时间:2016-08-02 16:33:12

标签: java android dependency-injection dagger-2 dagger

我使用dagger 2将FragmentManager和FragmentTransaction注入我的Activity。 在我添加

之前,一切看起来都很好
$('#addUserSubmit').click(function () {
    var tagId = $(this).closest('form').find('input[name="userTag"]').val();
    var adminUser = $(this).closest('form').find('input[name="userName"]').val();
    AddUser(tagId, adminUser);
});

function AddUser(tagId, adminUser) {
    var data = JSON.stringify({
        'tagId': tagId,
        'adminUser': adminUser
    });
    $.ajax({ //HERE IS WHERE THE ERROR OCCURS (After it goes through to set all of the variables below).
        type: "POST",
        url: "/UsersAccounts/AddUser",
        data: data,
        success: function (outVal) {
        },
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            alert(XMLHttpRequest + textStatus + errorThrown);
        },
        contentType: 'application/json'
    }); //IF I ADD A BREAKPOINT HERE IT WILL WORK IN GOING TO THE MVC 
        //FUNCTION TO BELOW AND IT WILL WORK AS INTENDED (BUT IF I RUN 
        //THE CODE NORMALLY OR WITHOUT A BREAKPOINT HERE IT WILL ALERT 
        //WITH THE ERROR ABOVE).
}

    [HttpPost]
    public String AddUser(int tagId, string adminUser){
        if (tagId > 0){
            try{
                using (TubeBPC db = new TubeBPC()){
                    Users user = new Users() {TAGID=tagId, AdminUser=adminUser };
                    db.Users.Add(user);
                    db.SaveChanges();
                    return "success";
                }
            }
            catch(Exception dbe){
                throw dbe;
            }
        }
        else{
            throw new ArgumentOutOfRangeException("TagID is not a positive number");
        }
     }

进入我的活动,它会在重建时抛出错误,如下所示:

  

错误:(21,10)错误:如果没有@ Provide-或@ Produces-annotated方法,则无法提供android.support.v4.app.FragmentManager。   注入android.support.v4.app.FragmentManager   com.toranj.tyke.ui.MainActivity.fragmentManager   com.toranj.tyke.ui.MainActivity注入   com.toranj.tyke.dagger.components.LotteryComponent.inject(活性)

以下是模块

@Inject
FragmentManager fragmentManager;

@Inject
FragmentTransaction fragmentTransaction

以下是组件

@Module
public class FragmentModule {

    FragmentActivity activity;

    public FragmentModule(FragmentActivity activity) {
        this.activity = activity;
    }

    @Provides
    @PerActivity
    public FragmentManager providesFragmentManager() {
        return activity.getSupportFragmentManager();
    }

    @Provides
    @PerActivity
    public FragmentTransaction providesFragmentTransaction() {
        return activity.getSupportFragmentManager().beginTransaction();
    }
}

这是我的活动:

@PerActivity
@Component(modules = FragmentModule.class)
public interface FragmentComponent {
    void inject(Activity activity);

    FragmentManager fragmentManager();
    FragmentTransaction fragmentTransaction();
}

我很擅长使用匕首和依赖注入,我可能在某处错过了一点。任何有解释的答案都会帮助我理解注射,也非常感谢。

编辑:模块,组件和活动中使用的所有fragmentManage都来自 android.support.v4.app.FragmentManager

3 个答案:

答案 0 :(得分:1)

我想在names中使用了t = '\n'.join(str(n) for n in names)

应该使用

android.app.FragmentManager

答案 1 :(得分:0)

从我在错误中看到的内容,您似乎正在使用其他组件来注入活动:LotteryComponent.java

另外,请尝试更改此方法

@Provides
@PerActivity
public FragmentTransaction providesFragmentTransaction() {
    return activity.getSupportFragmentManager().beginTransaction();
}

@Provides
@PerActivity
public FragmentTransaction providesFragmentTransaction(FragmentManager fm) {
    return fm.beginTransaction();
}

我怀疑这会解决问题,但值得一试,至少你会从同一来源一致地检索对象。

答案 2 :(得分:0)

您应该注入您真正想要使用的类。

public interface FragmentComponent {
    void inject(Activity activity);
}

这将注入Activity,它是Android Framework的一部分,没有任何@Inject注释字段。这种注入方法基本上是无操作。

Dagger在编译时生成依赖图。它不知道您突然尝试注入MainActivity并期望FragmentManager出现。

TL;博士

提供

public interface FragmentComponent {
    void inject(MainActivity activity);
}

它应该有用。