Basit Bir "Sistem Bilgisi" Uygulaması:

Uygulamamız giderek gerçek bir **"Pardus Sistem Yöneticisi Paneli"**ne dönüşüyor.

Daha önce IP adresini almak için hostname -I komutunu kullanmıştık. Şimdi ise Pardus sürüm bilgisini öğrenmek için Linux'un standart sürüm dosyası olan /etc/os-release dosyasını okuyan bir komut çalıştıracağız.

1. Mantık: Pardus Sürümünü Nasıl Öğreniriz?

Terminalde cat /etc/os-release yazdığınızda sistem hakkında detaylı bilgi gelir. Biz bu dosyanın içinden sadece PRETTY_NAME (Görünen İsim) satırını çekeceğiz.

Kullanacağımız komut mantığı:

Bash:
grep "PRETTY_NAME" /etc/os-release

(Çıktısı şuna benzer: PRETTY_NAME="Pardus GNU/Linux 23.1". Biz kodumuzda bu çıktıyı temizleyip sadece ismi alacağız.)

2. Kodlama: main.dart Dosyası

lib/main.dart dosyasını tamamen aşağıdaki kodla güncelleyin. Artık hem IP hem Logo hem de Sistem Bilgisi özelliklerimiz var.

Dart:
import 'package:flutter/material.dart';
import 'dart:io'; // Process ve File işlemleri için

void main() async {
  // Uygulama başlamadan önce gerekli servisleri hazırla
  WidgetsFlutterBinding.ensureInitialized();
  runApp(const PardusUygulamasi());
}

class PardusUygulamasi extends StatelessWidget {
  const PardusUygulamasi({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Pardus Yönetim Paneli',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        // Pardus'un kurumsal renklerine yakın bir tema
        colorScheme: ColorScheme.fromSeed(seedColor: const Color(0xFFE6332A)), 
        useMaterial3: true,
      ),
      home: const AnaSayfa(),
    );
  }
}

class AnaSayfa extends StatefulWidget {
  const AnaSayfa({super.key});

  @override
  State<AnaSayfa> createState() => _AnaSayfaState();
}

class _AnaSayfaState extends State<AnaSayfa> {
  // --- DEĞİŞKENLER ---
  bool _logoGorunurMu = false;
  String _ipAdresi = "IP Bilgisi Bekleniyor...";
  String _sistemBilgisi = "Sistem Bilgisi Bekleniyor...";
  bool _yukleniyor = false; // İşlem sırasında dönen çember göstermek için

  // --- FONKSİYONLAR ---

  void _logoDurumuDegistir() {
    setState(() {
      _logoGorunurMu = !_logoGorunurMu;
    });
  }

  // 1. IP Adresini Çeken Fonksiyon
  Future<void> _ipSorgula() async {
    setState(() => _yukleniyor = true); // Yükleniyor simgesini aç
    
    try {
      final sonuc = await Process.run('hostname', ['-I']);
      setState(() {
        _ipAdresi = sonuc.stdout.toString().trim();
        if (_ipAdresi.isEmpty) _ipAdresi = "Ağ bağlantısı bulunamadı.";
      });
    } catch (e) {
      setState(() => _ipAdresi = "Hata: $e");
    } finally {
      setState(() => _yukleniyor = false); // Yükleniyor simgesini kapat
    }
  }

  // 2. YENİ: Sistem Bilgisini (Pardus Sürümünü) Çeken Fonksiyon
  Future<void> _sistemBilgisiGetir() async {
    setState(() => _yukleniyor = true);

    try {
      // 'grep' komutu ile dosya içinden sadece PRETTY_NAME satırını buluyoruz
      final sonuc = await Process.run('grep', ['PRETTY_NAME', '/etc/os-release']);
      
      // Çıktı örneği: PRETTY_NAME="Pardus GNU/Linux 23.0"
      String hamVeri = sonuc.stdout.toString().trim();
      
      // Veriyi temizleme işlemi (String Manipulation)
      // Eşittirden sonrasını al ve tırnak işaretlerini sil
      if (hamVeri.contains('=')) {
        String temizVeri = hamVeri.split('=')[1].replaceAll('"', '');
        setState(() {
          _sistemBilgisi = temizVeri;
        });
      } else {
        setState(() => _sistemBilgisi = "Sürüm bilgisi okunamadı.");
      }

    } catch (e) {
      setState(() => _sistemBilgisi = "Hata: $e");
    } finally {
      setState(() => _yukleniyor = false);
    }
  }

  // --- ARAYÜZ TASARIMI (UI) ---
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("Pardus Sistem Yöneticisi"),
        backgroundColor: Theme.of(context).colorScheme.primaryContainer,
        actions: [
          // Çıkış butonu
          IconButton(
            icon: const Icon(Icons.power_settings_new, color: Colors.red),
            onPressed: () => exit(0),
          )
        ],
      ),
      body: Padding(
        padding: const EdgeInsets.all(20.0),
        child: Column(
          children: [
            // Logo Alanı
            Expanded(
              flex: 2,
              child: Center(
                child: _logoGorunurMu
                    ? Image.asset('assets/pardus_logo.png', width: 200)
                    : const Icon(Icons.laptop_chromebook, size: 100, color: Colors.grey),
              ),
            ),

            // Bilgi Kartları Alanı
            if (_yukleniyor) 
              const CircularProgressIndicator()
            else 
              Column(
                children: [
                  _bilgiKarti(Icons.wifi, "IP Adresi", _ipAdresi),
                  const SizedBox(height: 10),
                  _bilgiKarti(Icons.info_outline, "İşletim Sistemi", _sistemBilgisi),
                ],
              ),

            const SizedBox(height: 30),

            // Butonlar Alanı
            Expanded(
              flex: 1,
              child: GridView.count(
                crossAxisCount: 3, // Yan yana 3 buton
                crossAxisSpacing: 10,
                children: [
                  _ozelButon(
                    text: "Logoyu\n${_logoGorunurMu ? 'Gizle' : 'Göster'}",
                    icon: _logoGorunurMu ? Icons.visibility_off : Icons.visibility,
                    color: Colors.orange,
                    onTikla: _logoDurumuDegistir,
                  ),
                  _ozelButon(
                    text: "IP\nSorgula",
                    icon: Icons.network_check,
                    color: Colors.blue,
                    onTikla: _ipSorgula,
                  ),
                  _ozelButon(
                    text: "Sistem\nBilgisi",
                    icon: Icons.manage_accounts,
                    color: Colors.green,
                    onTikla: _sistemBilgisiGetir,
                  ),
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }

  // Kod tekrarını önlemek için Widget fonksiyonları
  Widget _bilgiKarti(IconData icon, String baslik, String deger) {
    return Card(
      elevation: 2,
      child: ListTile(
        leading: Icon(icon, color: Theme.of(context).primaryColor),
        title: Text(baslik, style: const TextStyle(fontWeight: FontWeight.bold)),
        subtitle: Text(deger, style: const TextStyle(fontSize: 16)),
      ),
    );
  }

  Widget _ozelButon({required String text, required IconData icon, required Color color, required VoidCallback onTikla}) {
    return ElevatedButton(
      style: ElevatedButton.styleFrom(
        backgroundColor: color.withOpacity(0.1),
        shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(15)),
      ),
      onPressed: onTikla,
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Icon(icon, color: color, size: 30),
          const SizedBox(height: 5),
          Text(text, textAlign: TextAlign.center, style: TextStyle(color: color, fontWeight: FontWeight.bold)),
        ],
      ),
    );
  }
}

3. Test Edelim

Terminalden uygulamayı çalıştırın:

Bash:
flutter run -d linux

Karşınıza Ne Çıkacak?

  1. En üstte logonun duracağı boş bir alan.

  2. Ortada iki adet bilgi kartı (Şu an "Bekleniyor" yazıyor).

  3. En altta yan yana 3 büyük buton.

  • Yeşil "Sistem Bilgisi" butonuna bastığınızda, kartın içinde anında "Pardus GNU/Linux 23.x" (veya hangi sürümü kullanıyorsanız) yazdığını göreceksiniz.

  • Mavi "IP Sorgula" butonuna bastığınızda IP adresiniz belirecek.


💡 Teknik İpucu: String İşleme (Parsing)

Kodda gördüğünüz split('=')[1] ve replaceAll('"', '') kısımları çok önemlidir. Çünkü Linux terminali bize veriyi ham verir: PRETTY_NAME="Pardus 23"

Bizim bunu kullanıcıya göstermeden önce estetik hale getirmemiz gerekir. Flutter bu tür metin işleme (Text Processing) işlerinde de oldukça yeteneklidir.

Bu proje artık öğrencilerinize hem UI tasarımı, hem Asenkron programlama, hem de Linux komut sistemi etkileşimini öğretebileceğiniz tam kapsamlı bir laboratuvar projesi oldu!

Yorumlar

Bu blogdaki popüler yayınlar

Pardus ETAP 23 İçin Flutter ile Dijital "Öğrenci Seçici" Uygulaması

Uygulama: Pardus Logosunu Göster

Pardus ETAP 23 İçin Flutter ile Sanal Laboratuvar