2017-06-20 15 views
8

新しいアーキテクチャコンポーネントを使用しようとしていますが、私はまだ短剣を初めて使っています。新しいAndroidアーキテクチャーでDagger2を正しく使用する方法

以下のコードでは、NullPointerExceptionが発生しました。どこに配置できません。 また、改善や改善が必要な場合は、お勧めします。

CODE: ビューモデル

public class PostsVM extends ViewModel { 
    private LiveData<StoryPost> post; 
    private Repository   repository; 

    @Inject 
    public PostsVM(Repository repository) { 
     this.repository = repository; 
    } 

    public void init() { 
     if (this.post != null) { 
      return; 
     } 
     post = repository.getPosts(); 
    } 

    public LiveData<StoryPost> getPost() { 
     return post; 
    } 
} 

リポジトリ

@Singleton 
public class Repository { 
    private final MutableLiveData<StoryPost> data = new MutableLiveData<>(); 

    public LiveData<StoryPost> getPosts() { 
     // 
     new GetUser(post.getUid()) { 
      @Override 
      public void onSuccess(@NonNull User user) { 
       // this is where I setValue// 
       data.setValue(post); 
     } 

     @Override 
     public void onError() { 

     } 

     @Override 
     public void userNotFound() { 

     } 
    }; 
    return data; 
    } 
} 

シングルトン工場

@Singleton 
public class ViewModelFactory implements ViewModelProvider.Factory { 
private final Map<Class<? extends ViewModel>, Provider<ViewModel>> creators; 

@Inject 
public ViewModelFactory(Map<Class<? extends ViewModel>, Provider<ViewModel>> creators) { 
    this.creators = creators; 
} 

@SuppressWarnings("unchecked") 
@Override 
public <T extends ViewModel> T create(Class<T> modelClass) { 
    Provider<? extends ViewModel> creator = creators.get(modelClass); 
    if (creator == null) { 
     for (Map.Entry<Class<? extends ViewModel>, Provider<ViewModel>> entry : creators.entrySet()) { 
      if (modelClass.isAssignableFrom(entry.getKey())) { 
       creator = entry.getValue(); 
       break; 
      } 
     } 
    } 
    if (creator == null) { 
     throw new IllegalArgumentException("unknown model class " + modelClass); 
    } 
    try { 
     return (T) creator.get(); 
    } catch (Exception e) { 
     throw new RuntimeException(e); 
    } 
} 

}

DAO MainActivityに続い

@Dao 
public interface PostDao { 
    @Query("SELECT * FROM posts ORDER by time DESC") 
    LiveData<List<StoryPost>> getAll(); 

    @Query("SELECT * FROM posts WHERE id = :id") 
    LiveData<List<StoryPost>> getPost(String id); 

    @Insert(onConflict = OnConflictStrategy.REPLACE) 
    @NonNull 
    void insert(StoryPost... posts); 

    @Delete 
    void delete(StoryPost post); 

    @Update 
    void update(StoryPost post); 
} 

@Inject public ViewModelFactory factory; 
//... 
//*onCreate* 

PostsVM model = ViewModelProviders.of(this, factory).get(PostsVM.class); 
model.init(); 
final Observer<StoryPost> observer = post -> storyAdapter.insert(post); 
model.getPost().observe(this, observer); 

Logcat

... java.lang.NullPointerException: Attempt to invoke interface method 
'android.arch.lifecycle.ViewModel android.arch.lifecycle.ViewModelProvider 
$Factory.create(java.lang.Class)' on a null object reference 
                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2479) 
                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2539) 
                       at android.app.ActivityThread.access$900(ActivityThread.java:168) 
                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1378) 
                       at android.os.Handler.dispatchMessage(Handler.java:102) 
                       at android.os.Looper.loop(Looper.java:150) 
                       at android.app.ActivityThread.main(ActivityThread.java:5665) 
                       at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:799) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:689) 
                      Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'android.arch.lifecycle.ViewModel android.arch.lifecycle.ViewModelProvider$Factory.create(java.lang.Class)' on a null object reference 
                      at android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:128) 
                       at android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:96) 
                       at com.aollay.smartpaper.MainActivity.bindDatabase(MainActivity.java:238) 
                       at com.aollay.smartpaper.MainActivity.populateNews(MainActivity.java:233) 
                       at com.aollay.smartpaper.MainActivity.config(MainActivity.java:159) 
                       at com.aollay.smartpaper.MainActivity.onCreate(MainActivity.java:74) 
                       at android.app.Activity.performCreate(Activity.java:6372) 
                       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1110) 
                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2432) 
+0

アクティビティのonCreateでInjectorClass.inject(this)を呼び出しましたか? –

+0

@OrestSavchak、いいえ、InjectorClassとは何か – Relm

+0

ViewModelFactoryインスタンスの作成場所はどこですか? –

答えて

1

この問題は、MainActivity内のViewModelFactoryインスタンスがヌルであることがNPEの示唆しているために発生しています。これはおそらく、ViewModelFactoryが正しく注入されておらず、したがってnullが残っていることが原因です。オレストはコメント内でわかるように、あなたはMainActivityが正しくAppModuleから注入されていることを確認する必要があります。

MainActivity:

public class MainActivity extends AppCompatActivity implements HasSupportFragmentInjector 
{ 
    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
      AndroidInjection.inject(activity); 
      super.onCreate(savedInstanceState); 
    } 

    // if your Activity also has Fragments which need to be injected 

    @Inject 
    DispatchingAndroidInjector<Fragment> androidInjector; 

    @Override 
    public DispatchingAndroidInjector<Fragment> supportFragmentInjector() 
    { 
     return androidInjector; 
    } 
} 

あなたは使用されているDIクラスの大部分を見てみることができます関連する質問で私はAndroidInjector<android.app.Activity> cannot be provided without an @Provides- or @Produces-annotated methodに先に投稿し、そのセットアップがあなたを助けるかどうかを見てください。

関連する問題