iT邦幫忙

2022 iThome 鐵人賽

DAY 20
0

開頭

該建立好的都建立完成,接下來就是把他放到 Fragment 初始化,這樣就可以拿來存筆記內容啦

在 Fragment 初始化 ViewModel 和 ViewModelFactory

全域變數

因為 NoteFragmentViewModelFactory、NoteFragmentViewModel,可能會比較佔資源,所以我們用lateinit延遲初始化,binding是自動產生的,可以不用理他

class NoteFragment : Fragment() {
    private lateinit var binding: FragmentNoteBinding
    private lateinit var viewModelFactory: NoteFragmentViewModelFactory
    private lateinit var viewModel: NoteFragmentViewModel
}    

在 onCreateView 初始化 ViewModel 和 ViewModelFactory

有需要傳入 ViewModel 的東西,是先從 ViewModelFactory 傳入,再從 ViewModelFactory 帶到 ViewModel 內

class NoteFragment : Fragment() {
 
    override fun onCreateView(
        
        viewModelFactory = NoteFragmentViewModelFactory(傳入構造函數)        
        viewModel = ViewModelProvider(this, viewModelFactory)[NoteFragmentViewModel::class.java]
    ...
    }
}    

在 onCreateView 綁定 LiveData

viewLifecycleOwner 會自己產生,綁定後就算螢幕轉動,資料也會留著

class NoteFragment : Fragment() {

    override fun onCreateView(

        binding.viewModel = viewModel
        binding.lifecycleOwner = viewLifecycleOwner

        return binding.root
    }
}    

完成設定的 Fragment

class NoteFragment : Fragment() {
    private lateinit var binding: FragmentNoteBinding
    private lateinit var viewModelFactory: NoteFragmentViewModelFactory
    private lateinit var viewModel: NoteFragmentViewModel

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        binding = DataBindingUtil.inflate(
            inflater,
            R.layout.fragment_note,
            container,
            false
        )
        
        val application = requireNotNull(this.activity).application
        
        viewModelFactory = NoteFragmentViewModelFactory()        
        viewModel = ViewModelProvider(this, viewModelFactory)[NoteFragmentViewModel::class.java]

        binding.viewModel = viewModel
        binding.lifecycleOwner = viewLifecycleOwner

        return binding.root
    }
}    

在 onViewCreated 初始化元件

onCreateView 負責把基本架構建立好,剩下的 TextView 那些就會在頁面建立完成後才初始化,也就是 onViewCreated

class NoteFragment : Fragment() {
    private lateinit var binding: FragmentNoteBinding
    private lateinit var viewModelFactory: NoteFragmentViewModelFactory
    private lateinit var viewModel: NoteFragmentViewModel

    override fun onCreateView(

        ...
        
        return binding.root
    }
    
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        //TextView 初始化

    }
}    

上一篇
111/19 - Room(3/4) - Database
下一篇
111/21 - Room(5/5) - 使用共常式操作資料庫、單元測試
系列文
聽說 HackMD 開放 API 串接,那麼用 Kotlin 寫個筆記 App 吧!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言