2017-08-24 38 views
1

我想從Android開發者網站的這個鏈接的代碼,並面臨着一些問題:的Android架構的代碼不工作

https://developer.android.com/topic/libraries/architecture/guide.html 

    Here is my code: 

public class UserProfileFragment extends LifecycleFragment { 

     private static final String UID_KEY = "uid"; 
     private UserProfileViewModel viewModel; 
     public UserProfileFragment() { 
      // Required empty public constructor 
     } 


     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
           Bundle savedInstanceState) { 
      // Inflate the layout for this fragment 
      return inflater.inflate(R.layout.fragment_user_profile, container, false); 
     } 

     @Override 
     public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
      super.onActivityCreated(savedInstanceState); 
    //  String userId = getArguments().getString(UID_KEY); 
      viewModel = ViewModelProviders.of(this).get(UserProfileViewModel.class); 
      //ViewModelProviders.of(this, viewModelFactory).get(MoviesDataViewModel.class); 
      viewModel.init(); 
      viewModel.getUser().observe(this, user -> { 
       Log.i("UI","Update ui"); 
      }); 
     } 

    } 

    public class UserProfileViewModel extends ViewModel { 

     private LiveData<User> user; 
     private UserRepository userRepo; 

     @Inject // UserRepository parameter is provided by Dagger 2 
     public UserProfileViewModel(UserRepository userRepo) { 
      this.userRepo = userRepo; 
     } 

     public UserProfileViewModel() { 

     } 

     public void init() { 
      if (this.user != null) { 
       // ViewModel is created per Fragment so 
       // we know the userId won't change 
       return; 
      } 
      user = userRepo.getUser(); 
     } 

     public LiveData<User> getUser() { 
      return this.user; 
     } 

    } 

public class UserRepository { 
    private Webservice webservice; 
    // ... 
    public LiveData<User> getUser() { 
     // This is not an optimal implementation, we'll fix it below 
     final MutableLiveData<User> data = new MutableLiveData<>(); 
     webservice.getUser().enqueue(new Callback<User>() { 
      @Override 
      public void onResponse(Call<User> call, Response<User> response) { 
       // error case is left out for brevity 
       data.setValue(response.body()); 
      } 

      @Override 
      public void onFailure(Call<User> call, Throwable t) { 
       t.printStackTrace(); 
      } 
     }); 
     return data; 
    } 
} 

的userRepo對象在UserProfileViewModel類來爲空。此代碼:

public UserProfileViewModel(UserRepository userRepo) { 
      this.userRepo = userRepo; 
     } 

根本沒有得到執行。我也是Dagger2的新手。任何幫助將不勝感激。在原帖中沒有提及相同的內容,因此我被卡住了。

回答

0

viewModel = ViewModelProviders.of(this).get(UserProfileViewModel.class);

您沒有使用ViewModelProvider.Factory。首先,您應該創建視圖模型工廠類,您可以將資源庫傳遞給ViewModel。

ViewModelProvider.Factory

@yourscope 
public class UserRepositoryModelFactory implements ViewModelProvider.Factory { 

    @Inject 
    UserRepository userRepository; 

    @Inject 
    public UserRepositoryModelFactory() { 
    } 

    @Override 
    public <T extends ViewModel> T create(Class<T> modelClass) { 
     if (modelClass.isAssignableFrom(UserProfileViewModel.class)) { 
      return (T) new UserProfileViewModel(userRepository); 
     } 
     throw new IllegalArgumentException("Wrong ViewModel class"); 
    } 
} 

在活動注入視圖模型工廠

@Inject 
UserRepositoryModelFactory userRepoViewModelFactory; 

在實例使用視圖模型視圖模型工廠。

userViewModel = ViewModelProviders.of(this, userRepoViewModelFactory).get(UserProfileViewModel.class); 

如果您需要了解更多信息,您可以檢查http://www.zoftino.com/android-architecture-component-viewmodel

+0

非常感謝您的回覆。這對我有效。 –