Sintaks singkat titik .foo dapat menghilangkan nama tipe. Selama kompiler bisa menyimpulkan tipe target dari konteks, kamu dapat menulis kode Dart yang lebih ringkas. Saat mengakses nilai enum, anggota statis, dan konstruktor, kamu tidak perlu menuliskan lengkap Tipe.foo.
Sederhananya: singkatan titik mengizinkan ekspresi dimulai dengan bentuk di bawah ini, dan kamu bisa merantai operasi lain setelahnya:
- Pengidentifikasi
.myValue - Konstruktor
.new() - Pembuatan konstanta
const .myValue()
Contoh
enum Status { none, running, stopped, paused }
class Point {
final int x, y;
Point(this.x, this.y);
Point.origin() : x = 0, y = 0;
}
void main() {
// Singkatan konstruktor bernama
Point origin = .origin(); // Sama dengan Point.origin()
// Singkatan enum
Status currentStatus = .running; // Sama dengan Status.running
// Singkatan metode statis
int port = .parse('8080'); // Sama dengan int.parse('8080')
}Code language: Dart (dart)
Tipe konteks (Context type)
Singkatan titik mengandalkantipe konteks agar kompiler dapat menyimpulkan anggota tipe yang sesuai.
Tipe konteks: tipe yang diharapkan Dart di posisi tersebut, sesuai lokasi penulisan ekspresi.
Contoh: Status currentStatus = .running
Kompiler mengetahui variabel bertipe Status, sehingga membaca .running sebagai Status.running.
Struktur leksikal dan sintaks
Singkatan anggota statis merupakan ekspresiyang diawali karakter .. Apabila konteks dapat menentukan tipe dengan jelas, kamu bisa mengakses anggota statis, konstruktor, dan konstanta enum secara singkat.
Kasus penggunaan
1. Enum
Saat penugasan dan pencocokan switch, tipe enum sudah jelas, sehingga sangat cocok menggunakan singkatan ini:
enum LogLevel { debug, info, warning, error }
String colorCode(LogLevel level) {
return switch (level) {
.debug => 'gray',
.info => 'blue',
.warning => 'orange',
.error => 'red',
};
}
void main() {
// Pemanggilan
String warnColor = colorCode(.warning); //Terdeteksi otomatis sebagai LogLevel.warning
}Code language: Dart (dart)
2. Konstruktor bernama / Konstruktor pabrik
Mendukung pengiriman parameter tipe ke konstruktor kelas generik:
class Point {
final double x, y;
const Point(this.x, this.y);
const Point.origin() : x = 0, y = 0;
factory Point.fromList(List<double> list) => Point(list[0], list[1]);
}
void main() {
Point origin = .origin();
Point p1 = .fromList([1.0, 2.0]);
// Kelas generik
List<int> intList = .filled(5, 0); // List.filled(5,0)
}Code language: Dart (dart)
3. Konstruktor tanpa parameter .new
.new digunakan untuk memanggil konstruktor anonim bawaan kelas secara singkat. Cocok untuk inisialisasi banyak field di kelas state, parameter generik akan disimpulkan secara otomatis:
// Sebelum pakai singkatan
late final AnimationController _animationController = AnimationController(vsync: this);
final ScrollController _scrollController = ScrollController();
// Setelah pakai singkatan
late final AnimationController _animationController = .new(vsync: this);
final ScrollController _scrollController = .new();
final GlobalKey<ScaffoldMessengerState> scaffoldKey = .new();
Map<String, Map<String, bool>> properties = .new();Code language: Dart (dart)
4 Anggota statis (metode statis, field statis)
int httpPort = .parse('80'); // int.parse('80')
BigInt bigIntZero = .zero; // BigInt.zeroCode language: Dart (dart)
5 Ekspresi konstanta
Dalam konteks konstanta, singkatan bisa digunakan jika anggota tujuan merupakan konstanta waktu kompilasi:
enum Status { none, running }
class Point {
final double x, y;
const Point(this.x, this.y);
const Point.origin() : x = 0.0, y = 0.0;
}
const Status defaultStatus = .running;
const Point myOrigin = .origin();
const List<Point> keyPoints = [.origin(), .new(1.0, 1.0)];Code language: Dart (dart)
Pemanggilan berantai
Kamu bisa merantai metode atau properti instansi setelah singkatan titik. Kompiler akan menyelesaikan target singkatan berdasarkan konteks terlebih dahulu, tipe hasil kembalian dari pemanggilan berantai harus kompatibel:
String lowerH = .fromCharCode(72).toLowerCase();
// String.fromCharCode(72).toLowerCase()
print(lowerH); // hCode language: JavaScript (javascript)
void main() {
String lowerH = .fromCharCode(72).toLowerCase();
// String.fromCharCode(72).toLowerCase()
print(lowerH); // h
}Code language: Dart (dart)
D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
h
Code language: CSS (css)
Dot shorthands (singkatan titik)