Sistem slot merupakan arsitektur inti AliPlayerKit yang menggunakan pendekatan komponenisasi dan mekanisme pluggable untuk memecah antarmuka pemutar (player UI) menjadi komponen-komponen slot independen. Pendekatan ini mendekopel antarmuka sehingga memungkinkan komposisi dan ekstensi yang fleksibel.
Jenis slot
Sistem menyediakan jenis-jenis slot berikut, yang disusun berdasarkan urutan penumpukan dari bawah ke atas:
Jenis slot | Urutan default | Deskripsi | Visibilitas default |
playerSurface | 10 | Slot playerSurface untuk menampilkan konten video. (Kustomisasi tidak disarankan) | Ya |
subtitle | 20 | Slot subtitle untuk menampilkan teks terjemahan video. | Ya (kondisional) |
coverImage | 30 | Slot coverImage untuk menampilkan gambar sebelum video dimuat. | Ya (kondisional) |
playControl | 40 | Slot playControl untuk menangani kontrol gestur. | Ya |
topBar | 50 | Slot topBar, yang biasanya berisi tombol kembali (back), judul, dan tombol pengaturan (settings). | Ya |
bottomBar | 60 | Slot bottomBar, yang biasanya berisi kontrol pemutaran, bilah kemajuan (progress bar), dan tombol layar penuh (full-screen). | Ya |
seekThumbnail | 70 | Slot seekThumbnail untuk menampilkan gambar mini pratinjau saat bilah kemajuan ditarik. | Ya (kondisional) |
centerDisplay | 80 | Slot centerDisplay untuk menampilkan informasi seperti volume dan kecerahan selama operasi gestur. | Ya (kondisional) |
playState | 90 | Slot playState untuk menampilkan informasi status, seperti error pemutaran. | Ya (kondisional) |
settingMenu | 100 | Slot settingMenu, yang berisi opsi pengaturan pemutar. | Ya (kondisional) |
overlays | 110 | Slot overlays, yang berada di lapisan paling atas, digunakan untuk menambahkan konten kustom seperti elemen 'Like', 'Comment', dan 'Share'. | Tidak |
Urutan default: Semakin kecil nilainya, semakin rendah lapisannya. Slot bawaan memiliki jarak urutan sebesar 10, memberikan ruang yang cukup untuk menyisipkan slot kustom.
Slot
playerSurfacemerender konten video. Jangan mengkustomisasi slot ini karena modifikasi dapat menyebabkan pemutar mengalami malfungsi.
Penggunaan
UI default
Pemutar secara otomatis menggunakan UI default bawaan tanpa memerlukan konfigurasi tambahan:
AliPlayerWidget(controller)Kustomisasi slot
Gunakan parameter slotBuilders untuk mengkustomisasi slot mana pun. Slot yang tidak ditentukan akan menggunakan UI default.
Kustomisasi parsial
Ganti hanya slot yang perlu dikustomisasi dan biarkan sisanya menggunakan UI default:
AliPlayerWidget(
controller,
slotBuilders: {
SlotType.topBar: (context) => MyCustomTopBar(),
},
)Kustomisasi penuh
Kustomisasi semua slot untuk membangun UI yang sepenuhnya disesuaikan:
AliPlayerWidget(
controller,
slotBuilders: {
// Catatan: Mengkustomisasi playerSurface tidak disarankan.
SlotType.topBar: (context) => MyCustomTopBar(),
SlotType.bottomBar: (context) => MyCustomBottomBar(),
SlotType.playControl: (context) => MyPlayControl(),
SlotType.coverImage: (context) => MyCoverImage(),
SlotType.playState: (context) => MyPlayState(),
SlotType.centerDisplay: (context) => MyCenterDisplay(),
SlotType.seekThumbnail: (context) => MySeekThumbnail(),
SlotType.subtitle: (context) => MySubtitle(),
SlotType.settingMenu: (context) => MySettingMenu(),
SlotType.overlays: (context) => MyOverlays(),
},
)Tipe SlotWidgetBuilder
Sistem slot saat ini menggunakan tanda tangan builder yang ringkas:
// Tanda tangan saat ini (disarankan)
typedef SlotWidgetBuilder = Widget Function(BuildContext context);
// Tanda tangan lama (tidak digunakan lagi)
@Deprecated('Please use SlotWidgetBuilder instead')
typedef SlotWidgetBuilderWithController = Widget Function(
BuildContext context,
AliPlayerWidgetController controller,
);Desain saat ini menggunakan model Controller bersama yang tunggal. Mode layar penuh dan mode normal berbagi instance Controller yang sama, sehingga Anda tidak perlu meneruskannya melalui parameter builder.
Untuk mengakses Controller dalam slot kustom, rujuk langsung dari luar builder.
Sembunyikan slot
Atur builder suatu slot ke null untuk menyembunyikan slot tersebut:
AliPlayerWidget(
controller,
slotBuilders: {
SlotType.topBar: null,
SlotType.bottomBar: null,
},
)Kontrol tingkat detail
Untuk menyembunyikan elemen tertentu (seperti tombol) dalam slot default tanpa mengganti seluruh slot, gunakan hiddenSlotElements:
AliPlayerWidget(
controller,
hiddenSlotElements: const {
// Sembunyikan tombol Download dan Snapshot di top bar
SlotType.topBar: {
TopBarElements.download,
TopBarElements.snapshot,
},
// Nonaktifkan gestur double-tap dan swipe vertikal di playback control
SlotType.playControl: {
PlayControlElements.doubleTap,
PlayControlElements.leftVerticalDrag,
PlayControlElements.rightVerticalDrag,
},
},
)hiddenSlotElements hanya berlaku untuk slot default. Jika Anda mengkustomisasi slot dengan menggunakan slotBuilders, konfigurasi hiddenSlotElements untuk slot tersebut akan diabaikan.
UI kustom dan kontrol lapisan
Berbeda dengan solusi overlay tradisional, sistem slot memungkinkan Anda menyisipkan komponen UI kustom pada lapisan apa pun dalam pemutar, bukan hanya lapisan paling atas. Gunakan defaultOrder untuk mengontrol urutan rendering secara presisi. Hal ini memungkinkan penempatan komponen seperti watermark, bullet screen, dan iklan pada lapisan yang tepat sesuai kebutuhan:
SlotType adalah kelas yang dapat diperluas. Anda dapat membuat jenis slot kustom dan mengontrol posisi lapisannya menggunakan defaultOrder:
// Buat jenis slot kustom dan atur urutan lapisannya di antara coverImage (30) dan playControl (40).
const myWatermark = SlotType('watermark', defaultOrder: 35);
AliPlayerWidget(
controller,
slotBuilders: {
myWatermark: (context) => MyWatermarkWidget(),
},
// Semua slot secara otomatis diurutkan berdasarkan defaultOrder; tidak perlu enumerasi manual.
)Sistem secara otomatis mengurutkan semua slot bawaan dan kustom berdasarkan nilai defaultOrder-nya.
Cara kerja
Sistem slot menggunakan strategi rendering tiga tingkat:
Kustom terlebih dahulu: Sistem menggunakan builder kustom yang disediakan untuk suatu slot.
Fallback default: Sistem menggunakan builder default jika tidak ada builder kustom yang disediakan.
Secara eksplisit disembunyikan: Sistem menyembunyikan slot jika buildernya bernilai null.
Adaptasi skenario
Perilaku slot tertentu secara otomatis menyesuaikan diri berdasarkan skenario pemutaran (SceneType):
vod (skenario VOD): Semua fungsi slot didukung.
live (skenario siaran langsung): Fungsi slot untuk menarik bilah kemajuan dinonaktifkan.
listPlayer (skenario pemutar daftar): Fungsi slot untuk gestur vertikal dinonaktifkan.
restricted (skenario pemutaran terbatas): Fungsi slot untuk operasi garis waktu (timeline) dinonaktifkan.
minimal (skenario pemutaran minimal): Hanya slot
playerSurfaceyang ditampilkan.
Contoh
Untuk contoh lengkap penggunaan sistem slot, lihat example/lib/pages/slot/slot_demo_page.dart.
Sistem slot memudahkan pembuatan UI pemutar untuk berbagai kasus penggunaan.