android-fragments 将导航片段参数传递给视图模型类

dzjeubhm  于 2022-11-13  发布在  Android
关注(0)|答案(3)|浏览(177)

我是一个新的android应用程序开发。请帮助。我想直接在我的视图模型类中获得导航片段参数。我正在使用数据绑定。
下面是我的导航片段参数

<fragment>
          ......
           ..
        <action
            android:id="@+id/action_update_to_listOfStudentFragment"
            app:destination="@id/list_fragment" />
        <argument
            android:name="currentStudent"
            app:argType="com.example.school.model.Student" />
    </fragment>

当我点击我的回收器视图项时,我用导航动作传递参数对象。所以我在适配器的onbind函数中设置了click listener。我将学生对象作为参数传递。

holder.itemLayoutBinding.root.setOnClickListener {
        val action = ListOfStudentFragmentDirections.actionListOfStudentFragmentToUpdate(currentStudent)
        holder.itemLayoutBinding.root.findNavController().navigate(action)
    }

我的视图模型在这里。我想知道另一件事:我在这里使用AndroidViewModel作为数据库上下文。是否有其他方法可以避免使用AndroidViewModel?我想使用ViewModel,但视图模型不提供上下文。

class MainModleView(application: Application) : AndroidViewModel(application) {

val getAllStudentData: LiveData<List<Student>>
    val repository: Repository

    val inputName = MutableLiveData<String>()
    val inputAge = MutableLiveData<String>()

    init {
        val studentDao: StudentDao = StudentDatabase.getAllData(application).studentDao()
        repository = Repository(studentDao)
        getAllStudentData = repository.getAllData

    }

因此,在View-Model的实时数据中,我希望从 fragments arguments 设置inputNameinputAge值。

inputName.value = fragmentsarugments.name //arguments pass a model object from recyclerview on click function
inputAge.value = fragmentsarugments.age

请给予我一个解决方案。我只想在我的ViewModel中获取片段的参数。

vecaoik1

vecaoik11#

我认为这很简单。只要一行代码就可以完成你的工作。

class YourModleView(
    savedStateHandle: SavedStateHandle
) : ViewModel()

savedstatehand将在此处提供导航片段参数您参数类型为Studnet类

val myObject:Student = savedStateHandle["argument name in navigation"]

现在从你的fragment动作传递arguments对象,你将得到每个传递的arguments对象,并保存状态句柄。

myObject.something

你会得到你的传递对象。

oknwwptz

oknwwptz2#

使用ViewModelProviderFactory作为自定义参数。初始化视图模型时,可以直接传递参数。

class MeterListViewModelFactory implements ViewModelProvider.Factory {
    private final MainRepository mainRepository;
    private final Bundle mExtras;
    private final Context context;

    public MeterListViewModelFactory(Context context, MainRepository mainRepository, Bundle mExtras) {
        this.mainRepository = mainRepository;
        this.context = context;
        this.mExtras = mExtras;
    }

    @NonNull
    public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
        if (modelClass.equals(MeterListViewModel.class))
            //noinspection unchecked
            return (T) new MeterListViewModel(context,mainRepository, mExtras);
        return super.create(modelClass);
    }
}

创建如下视图模型

viewModel = new ViewModelProvider(this, new MeterListViewModelFactory(LdpApplication.getAppContext(), new MainRepository(new MainRemoteDataSource()
            , new MainCachedDataSource(AppRoomDatabaseImpl.getInstance(requireContext()).getAppDatabase())), getArguments())).get(MeterListViewModel.class);

然后,您可以从传递的参数初始化变量

public MeterListViewModel(Context context, MainRepository mainRepository, Bundle mExtras) {
        this.mainRepository = mainRepository;
        mContext = context;
        if (mExtras != null && mExtras.containsKey(AppConstants.K_METER_TYPE))
            metersType.setValue((MetersType) mExtras.getSerializable(AppConstants.K_METER_TYPE));
        if (mExtras.getString(AppConstants.K_COMMISSION_FILTER).equalsIgnoreCase(context.getString(R.string.txt_all))) {
            lastSelectedPosition = 0;
        } else if (mExtras.getString(AppConstants.K_COMMISSION_FILTER).equalsIgnoreCase(context.getString(R.string.txt_sign_off_pending))) {
            lastSelectedPosition = 1;
        } else if (mExtras.getString(AppConstants.K_COMMISSION_FILTER).equalsIgnoreCase(context.getString(R.string.txt_sign_off_pending_for_approval))) {
            lastSelectedPosition = 2;
        } else if (mExtras.getString(AppConstants.K_COMMISSION_FILTER).equalsIgnoreCase(context.getString(R.string.txt_sign_off_done))) {
            lastSelectedPosition = 3;
        } else {
            lastSelectedPosition = 4;
        }
        selectedFilterItem = mExtras.getString(AppConstants.K_COMMISSION_FILTER);
        commissionFilters = HelperClass.getCommissionFilters(context);
        this.loadMeters(null, true);

    }
ix0qys7i

ix0qys7i3#

将参数传递给视图模型

StudentFragment :Fragment(){

private val args: StudentFragmentArgs by navArgs()
private var viewModel:ViewModel?=null
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    viewModel = ViewModelProvider(this).get(MainModleView.class)
    vviewModel.inputName.value =  args.Student
 }
}

相关问题