Flutter Web Performansını Artırmak: Webview Optimizasyon Teknikleri
Flutter web'de webview kullanırken performans düşüşü yaşamak yaygın bir sorun. Özellikle ağır HTML/JavaScript içeriği yüklerken sayfanın donması, gecikmeli render ve yüksek bellek kullanımı ortaya çıkabiliyor. Bunları çözmek için stratejik bir yaklaşım gerekiyor.
İlk adım webview'ın cache mekanizmasını düzgün yapılandırmak. WebViewController'ı başlatırken cache ayarlarını aktif hale getir ve DOM işlemlerini minimize et.
1import 'package:webview_flutter/webview_flutter.dart';23class OptimizedWebView extends StatefulWidget {5_OptimizedWebViewState createState() => _OptimizedWebViewState();6}78class _OptimizedWebViewState extends State<OptimizedWebView> {9late WebViewController _controller;1012void initState() {13super.initState();14_initializeWebView();15}1617void _initializeWebView() {18_controller = WebViewController()..setJavaScriptMode(JavaScriptMode.unrestricted)..setBackgroundColor(const Color(0xffffffff))..setNavigationDelegate(19NavigationDelegate(20onPageStarted: (String url) {21print('Sayfa yükleniyor: $url');22},23onPageFinished: (String url) {24print('Sayfa yüklendi: $url');25},26),27);28}2931Widget build(BuildContext context) {32return WebViewWidget(controller: _controller);33}34}İkinci önemli teknik lazy loading. Sayfanın ilk yüklemesinde tüm kaynakları çekme yerine, kullanıcı ihtiyaç duyduğunda yükle. HTML tarafında `loading="lazy"` özelliğini kullan.
1// HTML içeriğinde resim ve iframe'ler için2const htmlContent = '''3<html>4<body>5<img src="image1.jpg" loading="lazy" />6<iframe src="content.html" loading="lazy"></iframe>7<script>8// DOM güncellemelerini batch yap9const fragment = document.createDocumentFragment();10for(let i = 0; i < 100; i++) {11const el = document.createElement('div');12el.textContent = 'Item ' + i;13fragment.appendChild(el);14}15document.body.appendChild(fragment);16</script>17</body>18</html>19''';2021_controller.loadHtmlString(htmlContent);Üçüncü adım JavaScript yürütme optimizasyonu. Ağır hesaplamalar veya DOM işlemleri yapıyorsan, bunları Web Worker'a taşı veya asenkron hale getir.
1// Webview'da performans izleme2_controller.runJavaScript('''3const observer = new PerformanceObserver((list) => {4for (const entry of list.getEntries()) {5console.log('Render süresi: ' + entry.duration + 'ms');6}7});8observer.observe({entryTypes: ['measure', 'navigation']});9''');Dört ana optimizasyon noktası daha var: (1) CSS ve JavaScript dosyalarını minify et, (2) görüntüleri WebP formatında sun, (3) gerekmeyenleri DOM'dan kaldır, (4) webview'ı hot reload sırasında yeniden başlatma. Sık yapılan hata, her setState() çağrısında webview'ı reload etmek. Bunun yerine durum yönetimi için Provider veya GetX kullan ve sadece gerekli verileri JavaScript tarafına gönder.
Bu teknikleri birleştirdiğinde webview performansı önemli ölçüde iyileşir ve kullanıcı deneyimi çok daha akıcı hale gelir.
0 yorum