я должен написать этот код в моем фрагменте / деятельности или в моей модели представления? - PullRequest
1 голос
/ 22 марта 2020

Я новичок в Android MVVM, поэтому мне нужно выполнить обрезку изображения и запросить разрешение на доступ к галерее изображений, и я не понимаю, должны ли они выполняться в моем фрагменте или в моей модели представления.

чтобы начать обрезку для предварительно полученного изображения, сохраненного на устройстве, я использую этот код

    CropImage.activity(selectedImagePosterFromGalleryUri)
        .setGuidelines(CropImageView.Guidelines.ON)
        .setRequestedSize(posterMaxWidthSize, posterMaxHeightSize, CropImageView.RequestSizeOptions.RESIZE_INSIDE)
        .start(mContext, this)

результат (обрезанное изображение) из этого кода может быть доступен в onActivityResult в моем фрагменте, когда requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE

Я сбит с толку, если он рассматривается как пользовательский ввод, поэтому я могу поместить этот код в свой фрагмент или он рассматривается как logi c / process, так что его следует поместить в viewmodel?

и Также мне нужно спросить разрешение на доступ к галерее, попросить разрешения я использую библиотеку, и код будет таким. я должен вставить фрагмент или модель представления?

    @AfterPermissionGranted(PERMISSION_READ_EXTERNAL_STORAGE)
    private fun checkPermission() {


        if (EasyPermissions.hasPermissions(mContext, Manifest.permission.READ_EXTERNAL_STORAGE)) {


            chooseImageFromGallery()

        } else {

            EasyPermissions.requestPermissions(
                this,
                "we need your permission to access your gallery",
                PERMISSION_READ_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE)
        }



    }

    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)

        EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
    }

    override fun onPermissionsDenied(requestCode: Int, perms: MutableList<String>) {

        if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {

            // showing app setting, so the user eventually can switch the permission manually in the setting section
            AppSettingsDialog.Builder(this).build().show()
        }

    }

    override fun onPermissionsGranted(requestCode: Int, perms: MutableList<String>) {


    }

то, что меня смущает, это предложение отсюда https://developer.android.com/jetpack/docs/guide, сказано:

Распространенной ошибкой является написание всего кода в Деятельности или Фрагменте. Эти основанные на пользовательском интерфейсе классы должны содержать только logi c, который обрабатывает пользовательский интерфейс и взаимодействие с операционной системой.

Я запутался, если обрезка изображения и доступ к галерее рассматриваются как logi c для ручек пользовательского интерфейса и работы системные взаимодействия или нет

Я не очень понимаю, чтобы выбрать код должен быть в viewmodel или в представлении (фрагмент / деятельность). для бизнес-логики c ясно, что она должна быть в viewmodel, но как насчет таких кодов? пожалуйста помогите

Ответы [ 2 ]

1 голос
/ 22 марта 2020

По словам парня из Google,

ViewModels не должно ничего знать о Android. Это улучшает тестируемость, безопасность утечек и модульность. Общее правило заключается в том, чтобы убедиться, что в ваших ViewModels нет android. * Импорта (за исключением, например, android .arch. *). То же самое относится и к докладчикам.

Если операция обрезки удовлетворяет этому условию, то обязательно добавьте ее в ViewModel .

Для получения более подробной информации https://medium.com/androiddevelopers/viewmodels-and-livedata-patterns-antipatterns-21efaef74a54

0 голосов
/ 22 марта 2020

Вы должны поместить его в вашу ViewModel и передать необходимые параметры, необходимые для функции.

Чтобы вы могли выбрать, где разместить эти логи c, подумайте об изменении пользовательского интерфейса. В качестве примера можно привести метод назначения текста для TextView на уровне фрагмента / активности, но вызывающий его - ViewModel.

...