2017-06-20 9 views
8

साथ Dagger2 उपयोग करने के लिए।कैसे ठीक से मैं और नए वास्तुकला घटकों का उपयोग करने की कोशिश कर रहा हूँ, लेकिन मैं भी अभी भी चाकू के लिए नया हूँ मैं सामान याद कर रहा हूँ नए Android वास्तुकला अवयव

नीचे कोड के साथ

, मैं एक NullPointerException हो रही है, पता नहीं लगा सकते हैं। अगर कुछ और है तो मुझे ठीक करने या सुधारने की ज़रूरत है, कृपया सुझाव दें।

कोड: ViewModel

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 
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); 
} 
फिर MainActivity में

:

@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

क्या आपने अपनी गतिविधि के निर्माण में InjectorClass.inject (यह) कहा है? –

+0

@OrestSavchak, नहीं मैं नहीं हूं, 'इंजेक्टर क्लास' – Relm

+0

क्या है मेरा मतलब है कि आप ViewModelFactory उदाहरण कहां बनाते हैं? –

उत्तर

1

यह मुद्दा ViewModelFactory उदाहरण के कारण आपके MainActivity के अंदर शून्य है, जैसा एनपीई सुझाव देता है। यह संभवतः इस तथ्य के कारण होता है कि ViewModelFactory ठीक से इंजेक्शन नहीं दिया जा रहा है, इस प्रकार शून्य शेष है। Orest टिप्पणियों के अंदर पता चलता है, आप सुनिश्चित करने की आवश्यकता है कि 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; 
    } 
} 

आप डि वर्गों के सबसे पर एक नज़र ले जा सकते हैं इस्तेमाल किया जा रहा एक संबंधित प्रश्न में मैंने पहले AndroidInjector<android.app.Activity> cannot be provided without an @Provides- or @Produces-annotated method पर पोस्ट किया था और देखें कि क्या यह सेटअप आपकी मदद करता है।

संबंधित मुद्दे

 संबंधित मुद्दे