The Code A can work well, I hope to assign a null default value for MediaRecorder.OnInfoListener.
But both Code B and Code C don't work, how can I fix it ?
Code A
fun startRecord(filename:String, mOnInfoListener: MediaRecorder.OnInfoListener){
mRecorder = MediaRecorder()
mRecorder?.let {
with(it) {
setOnInfoListener(mOnInfoListener)
}
}
public interface OnInfoListener
{
void onInfo(MediaRecorder mr, int what, int extra);
}
Code B
fun startRecord(filename:String, mOnInfoListener: MediaRecorder.OnInfoListener={ }){
...
}
Code C
fun startRecord(filename:String, mOnInfoListener: MediaRecorder.OnInfoListener=null){
...
}
CodePudding user response:
First, this does the same thing as your Code A, but it's cleaner:
fun startRecord(filename:String, mOnInfoListener: MediaRecorder.OnInfoListener) {
mRecorder = MediaRecorder().apply {
setOnInfoListener(mOnInfoListener)
}
}
If you want the property to possibly be null like in Code C, you have to put a ? after the type. Then it will allow you to set it as null by default:
fun startRecord(filename:String, mOnInfoListener: MediaRecorder.OnInfoListener? = null) {
mRecorder = MediaRecorder().apply {
if (mOnInfoListener != null) setOnInfoListener(mOnInfoListener)
}
}
Here's how you could do something like Code B, where it isn't null but instead it exists and simply does nothing. You can't pass a bare lambda because SAM conversion only works when you're calling a function. Instead, you have to use the name of the interface like a function call with SAM-converted lambda after it:
fun startRecord(filename:String, mOnInfoListener: MediaRecorder.OnInfoListener = MediaRecorder.OnInfoListener { }) {
mRecorder = MediaRecorder().apply {
setOnInfoListener(mOnInfoListener)
}
}
