Компонент навигации по архитектуре: onCreateView вызывается каждый раз - PullRequest
0 голосов
/ 26 февраля 2019

Экземпляр фрагмента каждый раз создается и перезагружается при повторном нажатии.

Как решить эту проблему?

Невозможность иметь правильный backstack в контроллере nav является огромной проблемой производительности.Надеюсь, что это отсутствующая функция или обходной путь, сделанный специально ... IMO, это необходимо, и должно быть введено раньше, чем позже (однако: https://issuetracker.google.com/issues/109856764 говорит Мы не будемразрешить настройку типа транзакции (например, скрытие / отображение и т. д.) в обозримом будущем. ): (

Nav-Framework хорош, но каждый раз создает представление фрагмента

У кого-нибудь есть решение?

Мой код предназначен для навигации с использованием Навигации

object NavigationHelper : Navigational {


override fun moveDownWithPop(view: View,id: Int,popStackId: Int) {
    Navigation.findNavController(view).navigate(id,
            null,
            NavOptions.Builder()
                    .setPopUpTo(popStackId,
                            true).build()
    )
}

override fun moveDownWithDataPop(view: View,id: Int,popStackId: Int,bundle : Bundle) {
    Navigation.findNavController(view).navigate(id,
            bundle,
            NavOptions.Builder()
                    .setPopUpTo(popStackId,
                            true).build()
    )
}

override fun moveUp(view: View) {
    Navigation.findNavController(view).navigateUp()
}

override fun moveDown(view: View,id: Int) {
    Navigation.findNavController(view).navigate(id)
}

override fun moveDown(view: View,id: Int,args : Bundle) {
    Navigation.findNavController(view).navigate(id,args)
}

fun navigateGraph(graphId : Int,context : Context){
    var finalHost: NavHostFragment?  = NavHostFragment.create(graphId)
    (context as MainActivity).supportFragmentManager.beginTransaction()
            .replace(com.admision.R.id.content,finalHost!!)
            .setPrimaryNavigationFragment(finalHost) // this is the equivalent to app:defaultNavHost="true"
            .commit()
}
}

Я нашел какой-то блог Почему я не буду использовать компонент архитектуры навигации

Ответы [ 2 ]

0 голосов
/ 29 июня 2019

как то, что делал Бхавеш, в моем случае у меня был только список, и мне достаточно было этой строки в onCreateView:

if (adapter.isEmpty()) {
            viewModel.getShopCats()
}

, и адаптер просто должен был иметь это:

fun isEmpty(): Boolean {
        return modelList.isNullOrEmpty()
}
0 голосов
/ 12 марта 2019

Мне понравилось, но я все еще жду разрешения от Google.

Здесь мы сделали, но все еще ждем лучшего приближения

if (manageEventViewModel == null) {
    manageEventViewModel = ViewModelProviders.of(activity!!).get(ManageEventViewModel::class.java)
    manageEventViewModel!!.setBinder(binding!!,context!!,listingType)
    loadAdvertisement(binding!!.advertise.imgAdvertisement,binding!!.advertise.tvAdvertisement,binding!!.advertise.llAdvertisement)
}

Полный код

class ManageEventsFragment : BaseFragment() {

private var binding: FragmentFindEventsBinding? = null
private var manageEventViewModel: ManageEventViewModel? = null
override fun onCreateView(inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?): View? {
    if (binding == null)
        binding = DataBindingUtil.inflate(inflater,R.layout.fragment_find_events,container,false)


    var listingType: String? = null
    if (arguments != null) {
        listingType = arguments!!.getString(Constant.LISTINGTYPE)
        /*if (listingType != null && listingType.equals(Constant.SEARCHLIST)) {
            val data = arguments!!.getString(Constant.SEARCHEVENTMODEL)
            val managetEventDataModel = com.admision.manageevents.utils.Utils.getManageEventDataModel(data)
            manageEventViewModel!!.setSearchDataModel(managetEventDataModel!!)
        }*/
    }

    val sharedViewModel = ViewModelProviders.of(activity!!).get(SharedViewModel::class.java)
    sharedViewModel!!.dataToShare.observe(this,Observer<ManageEventsDataModel> { managetEventDataModel ->
        listingType = Constant.SEARCHLIST
        manageEventViewModel!!.setSearchDataModel(managetEventDataModel!!)
    })

    if (manageEventViewModel == null) {
        manageEventViewModel = ViewModelProviders.of(activity!!).get(ManageEventViewModel::class.java)
        manageEventViewModel!!.setBinder(binding!!,context!!,listingType)
        loadAdvertisement(binding!!.advertise.imgAdvertisement,binding!!.advertise.tvAdvertisement,binding!!.advertise.llAdvertisement)
    }
    return binding!!.root
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...