xlints 1.0.0
xlints: ^1.0.0 copied to clipboard
Flutter performance linter - mendeteksi pola kode yang menyebabkan performa aplikasi buruk dan memberikan rekomendasi perbaikan.
xlints #
Lint package untuk Flutter yang fokus pada isu performa widget dan logic.
Rule yang tersedia #
Custom lint rules #
xlints_prefer_const_constructors
Deteksi widget yang bisa const tapi belum const.
BAD:
Widget build(BuildContext context) {
return Padding(
padding: EdgeInsets.all(8),
child: Icon(Icons.star),
);
}
GOOD:
Widget build(BuildContext context) {
return const Padding(
padding: EdgeInsets.all(8),
child: Icon(Icons.star),
);
}
xlints_prefer_listview_builder
Deteksi list panjang yang sebaiknya pakai .builder.
BAD:
ListView(
children: List.generate(1000, (i) => Text('Item $i')),
)
GOOD:
ListView.builder(
itemCount: 1000,
itemBuilder: (_, i) => Text('Item $i'),
)
xlints_avoid_listview_with_children
Deteksi penggunaan ListView/GridView(children: ...) yang membangun semua item sekaligus.
BAD:
GridView(
children: List.generate(200, (i) => Card(child: Text('$i'))),
)
GOOD:
GridView.builder(
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2),
itemCount: 200,
itemBuilder: (_, i) => Card(child: Text('$i')),
)
xlints_avoid_opacity_widget
Deteksi penggunaan Opacity untuk kasus yang bisa dihindari.
BAD:
Opacity(
opacity: 0.5,
child: Image.network(url),
)
GOOD:
AnimatedOpacity(
opacity: 0.5,
duration: const Duration(milliseconds: 200),
child: Image.network(url),
)
xlints_avoid_padding_wrapping_margin_widget
Deteksi Padding yang membungkus child yang sudah punya margin.
BAD:
Padding(
padding: const EdgeInsets.all(16),
child: Container(
margin: const EdgeInsets.all(8),
child: const Text('Hello'),
),
)
GOOD:
Container(
margin: const EdgeInsets.all(24),
child: const Text('Hello'),
)
xlints_avoid_shrink_wrap_true
Deteksi shrinkWrap: true pada list/grid yang dapat menambah biaya layout.
BAD:
ListView(
shrinkWrap: true,
children: items.map((e) => Text(e)).toList(),
)
GOOD:
Expanded(
child: ListView.builder(
itemCount: items.length,
itemBuilder: (_, i) => Text(items[i]),
),
)
xlints_avoid_intrinsic_widgets
Deteksi IntrinsicHeight/IntrinsicWidth yang mahal di layout.
BAD:
IntrinsicHeight(
child: Row(children: children),
)
GOOD:
SizedBox(
height: 72,
child: Row(children: children),
)
xlints_avoid_controller_in_build
Deteksi pembuatan controller/node di dalam build().
BAD:
@override
Widget build(BuildContext context) {
final controller = ScrollController();
return ListView(controller: controller);
}
BAD:
@override
Widget build(BuildContext context) {
final focusNode = FocusNode();
return TextField(focusNode: focusNode);
}
GOOD:
class _MyState extends State<MyWidget> {
late final ScrollController controller;
@override
void initState() {
super.initState();
controller = ScrollController();
}
@override
void dispose() {
controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return ListView(controller: controller);
}
}
xlints_avoid_widget_operator_equals
Deteksi override operator == di turunan Widget.
BAD:
class MyCard extends StatelessWidget {
@override
bool operator ==(Object other) => identical(this, other);
@override
int get hashCode => 0;
@override
Widget build(BuildContext context) => const SizedBox();
}
GOOD:
class MyCard extends StatelessWidget {
const MyCard({super.key});
@override
Widget build(BuildContext context) => const SizedBox();
}
xlints_avoid_set_state_in_build
Deteksi setState() di method build().
BAD:
@override
Widget build(BuildContext context) {
setState(() => counter++);
return Text('$counter');
}
GOOD:
void _increment() {
setState(() => counter++);
}
xlints_prefer_string_buffer
Deteksi string concatenation dengan + di dalam loop.
BAD:
var result = '';
for (var i = 0; i < 1000; i++) {
result = result + values[i];
}
GOOD:
final buffer = StringBuffer();
for (var i = 0; i < 1000; i++) {
buffer.write(values[i]);
}
final result = buffer.toString();
Prasyarat #
- Flutter SDK aktif di environment.
- Dart SDK sesuai constraint package (
sdk: ^3.10.4).
Instalasi #
Opsi A: dari pub.dev #
Tambahkan ke dev_dependencies:
dev_dependencies:
xlints: ^1.0.0
Jalankan:
flutter pub get
Opsi B: dari local path (untuk development package ini) #
dev_dependencies:
xlints:
path: ../path-ke-xlints
Jalankan:
flutter pub get
Setup analysis_options.yaml #
Pilih salah satu.
Opsi 1 (direkomendasikan): full config #
Gunakan jika kamu belum punya baseline lint sendiri:
include: package:xlints/analysis_options.yaml
Isi ini akan mengaktifkan:
package:lints/recommended.yaml- plugin
custom_lint
Opsi 2: plugin-only #
Gunakan jika project kamu sudah punya include lint lain (misalnya flutter_lints):
include: package:xlints/analysis_options_xlints.yaml
Catatan:
- Tidak perlu menambah
custom_lintmanual dipubspec.yaml. - Tidak perlu menambah
analyzer.pluginsmanual jika sudah include salah satu file di atas.
Cara menjalankan lint #
Jalankan dari root project aplikasi Flutter:
dart run custom_lint
Alternatif:
flutter pub run custom_lint
Untuk auto-apply fix yang tersedia:
dart run custom_lint --fix
Integrasi IDE #
- Pastikan file
analysis_options.yamlsudah benar. - Buka project ulang di IDE jika warning belum muncul.
- Quick Fix bisa dipakai dari lightbulb action (untuk rule yang punya fix).
Rule yang punya Quick Fix saat ini #
xlints_prefer_const_constructors: menambahkan keywordconst.xlints_avoid_padding_wrapping_margin_widget: menghapusPaddingterluar.
Konfigurasi rule #
Nonaktifkan rule tertentu:
include: package:xlints/analysis_options.yaml
custom_lint:
rules:
- xlints_prefer_const_constructors: false
- xlints_avoid_opacity_widget: false
Contoh penggunaan #
Project contoh ada di folder example/.
Jalankan:
cd example
dart run custom_lint
Contoh tersebut sengaja berisi pola "bad practice" agar semua rule xlints bisa terpicu.
Troubleshooting #
include_file_not_found untuk package:xlints/analysis_options.yaml #
Penyebab umum:
flutter pub getbelum dijalankan.- Package
xlintsbelum masuk ke dependency graph project. - Salah path untuk dependency lokal.
Langkah cek:
- Pastikan
pubspec.yamlsudah memuatxlintsdidev_dependencies. - Jalankan ulang
flutter pub get. - Pastikan include persis:
include: package:xlints/analysis_options.yaml - Jalankan lagi
dart run custom_lint.
Rule tidak muncul di IDE, tapi muncul di CLI #
- Reload window / restart analysis server IDE.
- Pastikan project dibuka dari folder root yang memuat
analysis_options.yaml.
Dependensi internal package #
analyzer: ^6.0.0custom_lint: ^0.6.0custom_lint_builder: ^0.6.0