xlints 1.0.0 copy "xlints: ^1.0.0" to clipboard
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_lint manual di pubspec.yaml.
  • Tidak perlu menambah analyzer.plugins manual 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.yaml sudah 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 keyword const.
  • xlints_avoid_padding_wrapping_margin_widget: menghapus Padding terluar.

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 get belum dijalankan.
  • Package xlints belum masuk ke dependency graph project.
  • Salah path untuk dependency lokal.

Langkah cek:

  1. Pastikan pubspec.yaml sudah memuat xlints di dev_dependencies.
  2. Jalankan ulang flutter pub get.
  3. Pastikan include persis: include: package:xlints/analysis_options.yaml
  4. Jalankan lagi dart run custom_lint.

Rule tidak muncul di IDE, tapi muncul di CLI #

  1. Reload window / restart analysis server IDE.
  2. Pastikan project dibuka dari folder root yang memuat analysis_options.yaml.

Dependensi internal package #

  • analyzer: ^6.0.0
  • custom_lint: ^0.6.0
  • custom_lint_builder: ^0.6.0
3
likes
0
points
226
downloads

Publisher

verified publisheranonimeact.com

Weekly Downloads

Flutter performance linter - mendeteksi pola kode yang menyebabkan performa aplikasi buruk dan memberikan rekomendasi perbaikan.

Repository (GitHub)
View/report issues

License

unknown (license)

Dependencies

analyzer, custom_lint, custom_lint_builder

More

Packages that depend on xlints