NativeScript で ListView の表示を強制的に更新する(主に iOS)
はじめに
NativeScript(NativeScript-Vue) の ListView の表示を強制的に更新する方法。
シチュエーションとしては、「お知らせ一覧」のようなものがあって、詳細を確認したら未読アイコンが消える、というような状況。
「お知らせ詳細」から戻るボタンで ListView に戻ってきても、未読アイコンが消えずにかなりハマった。
なお、Android だと上記の問題は起きなかったため、主に iOS 向けの内容。
TL;DR
Page
のloaded
イベントなどにハンドラを設定- ハンドラ内で
ListView.refresh()
を実行する - NativeScript-Vue の場合は
$refs
を使うと楽
目次
環境・条件
1 | $ sw_vers |
詳細
結論
Page
の loaded
イベントハンドラなどで refresh()
を使うと OK。
コードのイメージは下記、NativeScript-Vue を使っているので他の Flavor だと分かりづらいかもしれない。
※実際のコードからかなりデフォルメしている(本当は vuex
や computed
を使っている)ので、↓のサンプルコードだと問題が起きないかも。
xxxx.vue
1 | <template> |
ポイントは以下。
Page
のloaded
でListView
のrefresh()
を読んでいること- こうすると
ListView
から戻ってきたときも発火する
- こうすると
ListView
にref="news"
を設定していること$refs
経由でthis.$refs.news.refresh()
のようにメソッドを叩ける
まとめ
Page
のloaded
イベントなどにハンドラを設定- ハンドラ内で
ListView.refresh()
を実行する - NativeScript-Vue の場合は
$refs
を使うと楽
その他・メモ
ここにたどり着くまでにかなり紆余曲折があった(めっちゃハマった)。。。
Vue の watch
使ってみたり、Vuex の getter
使ってみたり、それらと v-if
や v-show
を組み合わせてみたり、などなど。。。
最終的には公式ドキュメントに載ってたんだけど、NativeScript はググラビリティが低い気がしてしまう。
(たぶん他のメジャーなやつ(ReactNative とか Flutter とか)に比べて、単純に事例が少ないだけなんだろうけど)
参考文献
- ListView - NativeScript-Vue
- ListView - NativeScript Docs
- ListView | NativeScript
- Visibility | NativeScript
- Change detection issue in ListView · Issue #377 · NativeScript/nativescript-angular
- Problem with listview not refreshing when updating observable · Issue #4836 · NativeScript/NativeScript
- vuexでのstate監視(watch) - Qiita
- ゲッター | Vuex
関連記事
- NativeScript, JsBarcode でバーコードを 生成/描画
- NativeScript でデバイスの輝度(明るさ)を制御する
- NativeScript で入力範囲外タップでキーボードを非表示にする
- NativeScript-Vue で次入力欄にフォーカスする方法
- NativeScript で Locale を意識した DatePicker/TimePicker
- NativeScript-Vue でページ読み込み後にページ移動やダイアログの表示
- JavaScript で URL のクエリパラメータを操作する方法
- jQuery Select2 で、初期値の設定と選択状態のクリア