【问题标题】:Android Architecture code not workingAndroid架构代码不起作用
【发布时间】:2017-08-29 12:19:35
【问题描述】:

我正在尝试 Android Developers 网站上此链接中的代码,但遇到了一些问题:

    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 类中为 null。这段代码:

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

根本没有被执行。我也是 Dagger2 的新手。任何帮助将不胜感激。原始帖子中也没有提及相同的内容,因此我被卡住了。

【问题讨论】:

    标签: android architecture


    【解决方案1】:

    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;
    

    在实例化 ViewModel 时使用视图模型工厂。

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

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

    【讨论】:

      猜你喜欢
      • 2015-11-18
      • 2017-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-08
      相关资源
      最近更新 更多