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ığı:
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.
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:
flutter run -d linux
Karşınıza Ne Çıkacak?
En üstte logonun duracağı boş bir alan.
Ortada iki adet bilgi kartı (Şu an "Bekleniyor" yazıyor).
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
Yorum Gönder