2017-08-24 27 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

非常感谢您的回复。这对我有效。 –