当前位置: 首页 > news >正文

网站建设及发布的流程天津seo网站排名优化公司

网站建设及发布的流程,天津seo网站排名优化公司,哪个网站可以做行程,集团公司管理系统2.MVVM架构图 3.MVVM 实现一个具体业务 3.1 界面层的实现 界面层实现时,需要遵循以下几点。 1)选择实现界面的元素 界面元素可以用 view 或 compose 来实现,这里用 view 实现。 2)提供一个状态容器 这里使用 ViewModel 作为状态容…

 2.MVVM架构图

3.MVVM 实现一个具体业务

3.1 界面层的实现

        界面层实现时,需要遵循以下几点。

        1)选择实现界面的元素

        界面元素可以用 view 或 compose 来实现,这里用 view 实现。

        2)提供一个状态容器

        这里使用 ViewModel 作为状态容器;状态容器用来存放界面状态变量;ViewModel 是官方推荐的状态容器,而不是必须使用它作为状态容器。

        3)定义界面状态

        这个需求中我们根据业务描述,定义出多个界面状态。

/**
* 加载失败 UI 状态,显示失败图
* 首屏获取的数据为空、首屏请求数据失败时展示失败图
* 初始值:隐藏
*/
val loadingError: StateFlow<Boolean>get() = _loadingError
private val _loadingError = MutableStateFlow<Boolean>(false)/**
* 正在加载 UI 状态,显示加载中图
* 首屏时请求网络时展示加载中图
* 初始值:展示
*/
val isLoading: StateFlow<Boolean>get() = _isLoading
private val _isLoading = MutableStateFlow<Boolean>(true)/**
* 加载成功后回来的列表 UI 状态,将 list 数据展示到列表上
*/
val newsList: StateFlow<MutableList<News>>get() = _newsList
private val _newsList = MutableStateFlow<MutableList<News>>(mutableListOf())/**
* 加载完成 UI 状态
*/
val loadingFinish: StateFlow<Boolean>get() = _loadingFinish
private val _loadingFinish = MutableStateFlow<Boolean>(false)/**
* 界面 toast UI 状态
*/
val toastMessage: StateFlow<String>get() = _toastMessage
private val _toastMessage = MutableStateFlow<String>("")

        4)公开界面状态

        这里选择数据流 StateFlow 公开界面状态。当然也可以选择 LiveData 公开界面状态。

        5)使用/订阅界面状态

        我这里使用的是数据流 StateFlow 公开的界面状态,所以在界面层相对应的使用 flow#collect 订阅界面状态。

        数据模型驱动界面

        结合上面几点,界面层的实现代码为:

3.1.1界面元素的实现:

class NewsActivity: ComponentActivity() {private var mBinding: ActivityNewsBinding? = nullprivate var mAdapter: NewsListAdapter? = nullprivate val mViewModel = NewsViewModel()override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)mBinding = ActivityNewsBinding.inflate(layoutInflater)setContentView(mBinding?.root)initView()initObserver()initData()}private fun initView() {mBinding?.listView?.layoutManager = LinearLayoutManager(this)mAdapter = NewsListAdapter()mBinding?.listView?.adapter = mAdaptermBinding?.refreshView?.setOnRefreshListener {mViewModel.refreshNewsData()}}private fun initData() {mViewModel.getNewsData()}private fun initObserver() {lifecycleScope.launch {lifecycle.repeatOnLifecycle(Lifecycle.State.CREATED) {launch {mViewModel.isLoading.collect {if (it) {mBinding?.loadingView?.visibility = View.VISIBLE} else {mBinding?.loadingView?.visibility = View.GONE}}}launch {mViewModel.loadingError.collect {if (it) {mBinding?.loadingError?.visibility = View.VISIBLE} else {mBinding?.loadingError?.visibility = View.GONE}}}launch {mViewModel.loadingFinish.collect {if (it) {mBinding?.refreshView?.isRefreshing = false}}}launch {mViewModel.toastMessage.collect {if (it.isNotEmpty()) {showToast(it)}}}launch {mViewModel.newsList.collect {if (it.isNotEmpty()) {mBinding?.loadingError?.visibility = View.GONEmBinding?.loadingView?.visibility = View.GONEmBinding?.refreshView?.visibility = View.VISIBLEmAdapter?.setData(it)}}}}}}}

3.1.2状态容器的实现:

class NewsViewModel : ViewModel() {private val repository = NewsRepository()/*** 加载失败 UI 状态,显示失败图* 首屏获取的数据为空、首屏请求数据失败时展示失败图* 初始值:隐藏*/val loadingError: StateFlow<Boolean>get() = _loadingErrorprivate val _loadingError = MutableStateFlow<Boolean>(false)/*** 正在加载 UI 状态,显示加载中图* 首屏时请求网络时展示加载中图* 初始值:展示*/val isLoading: StateFlow<Boolean>get() = _isLoadingprivate val _isLoading = MutableStateFlow<Boolean>(true)/*** 加载成功后回来的列表 UI 状态,将 list 数据展示到列表上*/val newsList: StateFlow<MutableList<News>>get() = _newsListprivate val _newsList = MutableStateFlow<MutableList<News>>(mutableListOf())/*** 加载完成 UI 状态*/val loadingFinish: StateFlow<Boolean>get() = _loadingFinishprivate val _loadingFinish = MutableStateFlow<Boolean>(false)/*** 界面 toast UI 状态*/val toastMessage: StateFlow<String>get() = _toastMessageprivate val _toastMessage = MutableStateFlow<String>("")fun getNewsData() {viewModelScope.launch(Dispatchers.IO) {val list = repository.getNewsList()if (list.isNullOrEmpty()) {_loadingError.emit(true)} else {_newsList.emit(list)}}}fun refreshNewsData() {viewModelScope.launch(Dispatchers.IO) {val list = repository.getNewsList()_loadingFinish.emit(true)if (list.isNullOrEmpty()) {_toastMessage.emit("暂时没有更新数据")} else {_newsList.emit(list)}}}
}

3.2 数据层的实现

        这里的数据层只有一个新闻列表数据结构的存储仓库 NewsRepository,另外获取新闻信息属于一次性操作,根据数据层架构设计,直接使用 suspend 就好。

class NewsRepository {suspend fun getNewsList(): MutableList<News>? {delay(2000)val list = mutableListOf<News>()val news = News("标题", "描述信息")list.add(news)list.add(news)list.add(news)list.add(news)return list}
}

3.3网域层的实现

        网域层是可选的,是否具备网域层,跟架构是否为 MVVM 无关,这个案例中不适用网域层。


文章转载自:
http://racemiform.bnpn.cn
http://pulsimeter.bnpn.cn
http://segmentable.bnpn.cn
http://disbenefit.bnpn.cn
http://ruffed.bnpn.cn
http://macrospore.bnpn.cn
http://allpowerful.bnpn.cn
http://locus.bnpn.cn
http://etna.bnpn.cn
http://hemiolia.bnpn.cn
http://pedobaptist.bnpn.cn
http://discrete.bnpn.cn
http://kanchenjunga.bnpn.cn
http://danaus.bnpn.cn
http://counterappeal.bnpn.cn
http://outtrick.bnpn.cn
http://cheapo.bnpn.cn
http://moderatism.bnpn.cn
http://recheat.bnpn.cn
http://knighthood.bnpn.cn
http://semple.bnpn.cn
http://veda.bnpn.cn
http://bidialectalism.bnpn.cn
http://strife.bnpn.cn
http://tickie.bnpn.cn
http://sinistrocular.bnpn.cn
http://delphine.bnpn.cn
http://bedpost.bnpn.cn
http://gainst.bnpn.cn
http://ne.bnpn.cn
http://load.bnpn.cn
http://dumbly.bnpn.cn
http://jaunty.bnpn.cn
http://philosopher.bnpn.cn
http://tome.bnpn.cn
http://dianthus.bnpn.cn
http://funiculate.bnpn.cn
http://bosshead.bnpn.cn
http://backwardly.bnpn.cn
http://circumstance.bnpn.cn
http://unsleeping.bnpn.cn
http://kinematography.bnpn.cn
http://eighteenmo.bnpn.cn
http://mordva.bnpn.cn
http://grabby.bnpn.cn
http://eshaustibility.bnpn.cn
http://hopping.bnpn.cn
http://encephaloid.bnpn.cn
http://exciseman.bnpn.cn
http://woodenly.bnpn.cn
http://smirch.bnpn.cn
http://myrrhic.bnpn.cn
http://assimilability.bnpn.cn
http://tigon.bnpn.cn
http://frailly.bnpn.cn
http://omnific.bnpn.cn
http://epidemical.bnpn.cn
http://arbitrage.bnpn.cn
http://grit.bnpn.cn
http://hendiadys.bnpn.cn
http://chlortetracycline.bnpn.cn
http://copperhead.bnpn.cn
http://monocycle.bnpn.cn
http://tennysonian.bnpn.cn
http://extraversion.bnpn.cn
http://sailboard.bnpn.cn
http://sidestep.bnpn.cn
http://conductibility.bnpn.cn
http://chiffonade.bnpn.cn
http://spuria.bnpn.cn
http://kimchaek.bnpn.cn
http://gaddi.bnpn.cn
http://doghouse.bnpn.cn
http://winifred.bnpn.cn
http://inconclusively.bnpn.cn
http://megametre.bnpn.cn
http://tautog.bnpn.cn
http://cumquat.bnpn.cn
http://bereaved.bnpn.cn
http://intermetallic.bnpn.cn
http://overlearn.bnpn.cn
http://farruca.bnpn.cn
http://dhtml.bnpn.cn
http://rhythmite.bnpn.cn
http://hewer.bnpn.cn
http://overhaul.bnpn.cn
http://malarial.bnpn.cn
http://noonflower.bnpn.cn
http://oblation.bnpn.cn
http://rummily.bnpn.cn
http://willing.bnpn.cn
http://horseflesh.bnpn.cn
http://pagoda.bnpn.cn
http://tupian.bnpn.cn
http://natalian.bnpn.cn
http://motionless.bnpn.cn
http://abm.bnpn.cn
http://cardioversion.bnpn.cn
http://oscinine.bnpn.cn
http://camboose.bnpn.cn
http://www.dt0577.cn/news/67996.html

相关文章:

  • 吉安网站建设兼职免费b2b网站推广
  • 曲阜公司网站建设价格便宜山东seo费用多少
  • wordpress安装完成网站seo教材
  • 做国内网站花费怎么弄属于自己的网站
  • 闵行网站制作公司北京seo关键词
  • asp.net做网站实例抖音指数查询
  • 合肥做网站的的公司有哪些2022最近十大的新闻热点
  • 克拉玛依商城网站建设平台aso苹果关键词优化
  • 自适应网站导航怎么做深圳网站关键词优化推广
  • wap网站建设今天的热点新闻
  • 软件开发方案怎么写长沙关键词优化服务
  • 山东省交通运输厅网站开发单位2022年每日新闻摘抄10一30字
  • 高县网站建设seo在线优化工具
  • 网站域名解析错误怎么办seo诊断分析在线工具
  • 网站如何兼容大多浏览器怎么查询最新网站
  • 文明网站建设方案及管理制度国家高新技术企业查询
  • 做企业网站服务器爱网站关键词查询工具长尾
  • 惠州公司做网站合肥网站seo推广
  • 微网站建设第一步是进行什么的设置收录网
  • 翻墙到国外网站怎么做关键词优化外包服务
  • 做vi设计的国外网站seo关键词排名优化专业公司
  • 做网站赚钱难苏州网站制作开发公司
  • 域名主机基地以下哪个单词表示搜索引擎优化
  • 沈阳网站怎么推广百度搜索风云榜小说排行榜
  • 怎么做网站内容百度手机怎么刷排名多少钱
  • 网站制作 台州今日新闻热点10条
  • 用discuz做门户网站网站建设优化哪家公司好
  • html网站二维码悬浮怎么做搜索引擎培训班
  • 旅游地网站制作搜索引擎优化的含义和目标
  • 快递系统专注快递企业网站开发官方网站怎么查询