الخطاء
The method 'isStopped' isn't defined for the type 'AndroidServiceInstance'.
Try correcting the name to the name of an existing method, or defining a method named 'isStopped'.dartundefined_method
في هذا الجزء
 Timer.periodic(const Duration(seconds: 5), (timer) async {
    if (service is AndroidServiceInstance && await service.isStopped()) {
      timer.cancel();
      return;
    }

وظهر هذا الخطاء
This expression has a type of 'void' so its value can't be used.
Try checking to see if you're using the correct API; there might be a function or call that returns void you didn't expect. Also check type parameters and variables which might also be void.dartuse_of_void_result
في هذا الجزء
 Future<void> _stopService() async {
    if (!_serviceRunning) return;
    await service.invoke('stopService');
    setState(() {
      _serviceRunning = false;
    });
  }
الكود الكلي
import 'dart:async';
import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:flutter_background_service/flutter_background_service.dart';
import 'package:flutter_background_service_android/flutter_background_service_android.dart';
import 'package:http/http.dart' as http;

// ------------------ دالة بدء الخدمة ----------------------
void onStart(ServiceInstance service) {
  // التعامل مع طلب إيقاف الخدمة
  service.on('stopService').listen((event) {
    if (service is AndroidServiceInstance) {
      service.stopSelf(); // إيقاف الخدمة فعليًا في الخلفية على Android
    }
  });

  Timer.periodic(const Duration(seconds: 5), (timer) async {
    if (service is AndroidServiceInstance && await service.isStopped()) {
      timer.cancel();
      return;
    }

    // Rest of your periodic code here ...
    try {
      final response = await http
          .get(Uri.parse('http://172.16.0.1/status?var=json'))
          .timeout(const Duration(seconds: 10));

      if (response.statusCode == 200) {
        final data = json.decode(response.body);

        String username = data['username'] ?? 'غير معروف';
        String ip = data['ip'] ?? 'غير معروف';
        String bytesIn = _formatBytes(data['bytes_in']?.toString() ?? '0');
        String bytesOut = _formatBytes(data['bytes_out']?.toString() ?? '0');
        String sessionTimeLeft =
            data['session_time_left']?.toString() ?? 'غير محدود';

        if (service is AndroidServiceInstance) {
          service.setForegroundNotificationInfo(
            title: "حالة الشبكة - $username",
            content:
                "IP: $ip | المستلم: $bytesIn | المرسل: $bytesOut | المتبقي: $sessionTimeLeft",
          );
        }

        service.invoke("update", data);
      }
    } catch (_) {
      if (service is AndroidServiceInstance) {
        service.setForegroundNotificationInfo(
          title: "حالة الشبكة",
          content: "خطأ في تحديث البيانات",
        );
      }
    }
  });
}

String _formatBytes(String bytes) {
  try {
    final value = int.parse(bytes);
    if (value < 1024) return '$value بايت';
    if (value < 1024 * 1024)
      return '${(value / 1024).toStringAsFixed(1)} كيلوبايت';
    if (value < 1024 * 1024 * 1024)
      return '${(value / (1024 * 1024)).toStringAsFixed(1)} ميجابايت';
    return '${(value / (1024 * 1024 * 1024)).toStringAsFixed(1)} جيجابايت';
  } catch (_) {
    return bytes;
  }
}

//  دعم iOS (تركها كما هي)
bool onIosBackground(ServiceInstance service) {
  return true;
}

// ------------------ التطبيق الرئيسي -------------------
Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();

  final service = FlutterBackgroundService();

  await service.configure(
    androidConfiguration: AndroidConfiguration(
      onStart: onStart,
      autoStart: false,
      isForegroundMode: true,
      foregroundServiceNotificationId: 888,
      notificationChannelId: "network_monitor_channel",
      initialNotificationTitle: "Network Monitor",
      initialNotificationContent: "الخدمة تعمل في الخلفية",
    ),
    iosConfiguration: IosConfiguration(
      autoStart: false,
      onForeground: onStart,
      onBackground: onIosBackground,
    ),
  );

  runApp(const MyApp());
}

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Network Monitor',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        fontFamily: 'Tajawal',
        scaffoldBackgroundColor: const Color(0xFFF5F7FA),
      ),
      home: const LoginScreen(),
      debugShowCheckedModeBanner: false,
    );
  }
}

// ------------ شاشة تسجيل الدخول --------------
class LoginScreen extends StatefulWidget {
  const LoginScreen({super.key});

  @override
  State<LoginScreen> createState() => _LoginScreenState();
}

class _LoginScreenState extends State<LoginScreen> {
  final _formKey = GlobalKey<FormState>();
  final _usernameController = TextEditingController();
  final _passwordController = TextEditingController();
  bool _isLoggingIn = false;
  bool _obscurePassword = true;

  @override
  void dispose() {
    _usernameController.dispose();
    _passwordController.dispose();
    super.dispose();
  }

  Future<void> _login() async {
    if (!_formKey.currentState!.validate()) return;

    setState(() => _isLoggingIn = true);

    try {
      final response = await http
          .post(
            Uri.parse('http://172.16.0.1/login'),
            headers: {'Content-Type': 'application/x-www-form-urlencoded'},
            body: {
              'username': _usernameController.text,
              'password': _passwordController.text,
            },
          )
          .timeout(const Duration(seconds: 10));

      if (response.statusCode == 200) {
        final data = json.decode(response.body);

        if (data['status'] == 'success' && mounted) {
          Navigator.pushReplacement(
            context,
            MaterialPageRoute(
              builder:
                  (context) => DashboardScreen(
                    username: _usernameController.text,
                    userData: {
                      'username': _usernameController.text,
                      'ip': data['ip'] ?? 'غير معروف',
                      'mac': data['mac'] ?? 'غير معروف',
                    },
                  ),
            ),
          );
        } else {
          throw Exception(data['message'] ?? 'فشل تسجيل الدخول');
        }
      } else {
        throw Exception('فشل الاتصال بالخادم');
      }
    } catch (e) {
      if (mounted) {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(
            content: Text('حدث خطأ: ${e.toString()}'),
            backgroundColor: Colors.red,
            behavior: SnackBarBehavior.floating,
            shape: RoundedRectangleBorder(
              borderRadius: BorderRadius.circular(10),
            ),
          ),
        );
      }
    } finally {
      if (mounted) setState(() => _isLoggingIn = false);
    }
  }

  @override
  Widget build(BuildContext context) {
    return Directionality(
      textDirection: TextDirection.rtl,
      child: Scaffold(
        body: SafeArea(
          child: SingleChildScrollView(
            padding: const EdgeInsets.all(24.0),
            child: Column(
              children: [
                const SizedBox(height: 40),
                Image.asset('assets/network_icon.png', height: 120, width: 120),
                const SizedBox(height: 32),
                Text(
                  'مرحباً بعودتك',
                  style: Theme.of(context).textTheme.headlineSmall?.copyWith(
                    fontWeight: FontWeight.bold,
                    color: const Color(0xFF2E384D),
                  ),
                ),
                const SizedBox(height: 8),
                Text(
                  'سجل الدخول للوصول إلى حسابك',
                  style: Theme.of(context).textTheme.bodyMedium?.copyWith(
                    color: const Color(0xFF8798AD),
                  ),
                ),
                const SizedBox(height: 32),
                Form(
                  key: _formKey,
                  child: Column(
                    children: [
                      TextFormField(
                        controller: _usernameController,
                        decoration: InputDecoration(
                          labelText: 'اسم المستخدم',
                          prefixIcon: const Icon(
                            Icons.person_outline_rounded,
                            color: Color(0xFFB0BAC9),
                          ),
                          border: OutlineInputBorder(
                            borderRadius: BorderRadius.circular(8),
                            borderSide: const BorderSide(
                              color: Color(0xFFE0E6ED),
                            ),
                          ),
                          enabledBorder: OutlineInputBorder(
                            borderRadius: BorderRadius.circular(8),
                            borderSide: const BorderSide(
                              color: Color(0xFFE0E6ED),
                            ),
                          ),
                          filled: true,
                          fillColor: Colors.white,
                        ),
                        validator:
                            (value) =>
                                (value == null || value.isEmpty)
                                    ? 'الرجاء إدخال اسم المستخدم'
                                    : null,
                      ),
                      const SizedBox(height: 16),
                      TextFormField(
                        controller: _passwordController,
                        obscureText: _obscurePassword,
                        decoration: InputDecoration(
                          labelText: 'كلمة المرور',
                          prefixIcon: const Icon(
                            Icons.lock_outline_rounded,
                            color: Color(0xFFB0BAC9),
                          ),
                          suffixIcon: IconButton(
                            icon: Icon(
                              _obscurePassword
                                  ? Icons.visibility_off_outlined
                                  : Icons.visibility_outlined,
                              color: const Color(0xFFB0BAC9),
                            ),
                            onPressed: () {
                              setState(() {
                                _obscurePassword = !_obscurePassword;
                              });
                            },
                          ),
                          border: OutlineInputBorder(
                            borderRadius: BorderRadius.circular(8),
                            borderSide: const BorderSide(
                              color: Color(0xFFE0E6ED),
                            ),
                          ),
                          enabledBorder: OutlineInputBorder(
                            borderRadius: BorderRadius.circular(8),
                            borderSide: const BorderSide(
                              color: Color(0xFFE0E6ED),
                            ),
                          ),
                          filled: true,
                          fillColor: Colors.white,
                        ),
                        validator:
                            (value) =>
                                (value == null || value.isEmpty)
                                    ? 'الرجاء إدخال كلمة المرور'
                                    : null,
                      ),
                      const SizedBox(height: 24),
                      SizedBox(
                        width: double.infinity,
                        height: 50,
                        child: ElevatedButton(
                          onPressed: _isLoggingIn ? null : _login,
                          style: ElevatedButton.styleFrom(
                            backgroundColor: const Color(0xFF3366FF),
                            shape: RoundedRectangleBorder(
                              borderRadius: BorderRadius.circular(8),
                            ),
                            elevation: 0,
                            shadowColor: Colors.transparent,
                          ),
                          child:
                              _isLoggingIn
                                  ? const SizedBox(
                                    width: 20,
                                    height: 20,
                                    child: CircularProgressIndicator(
                                      color: Colors.white,
                                      strokeWidth: 2,
                                    ),
                                  )
                                  : const Text(
                                    'تسجيل الدخول',
                                    style: TextStyle(
                                      fontSize: 16,
                                      fontWeight: FontWeight.bold,
                                    ),
                                  ),
                        ),
                      ),
                    ],
                  ),
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}

// ------------ شاشة لوحة التحكم ---------------
class DashboardScreen extends StatefulWidget {
  final String username;
  final Map<String, dynamic> userData;

  const DashboardScreen({
    super.key,
    required this.username,
    required this.userData,
  });

  @override
  State<DashboardScreen> createState() => _DashboardScreenState();
}

class _DashboardScreenState extends State<DashboardScreen>
    with WidgetsBindingObserver {
  bool _isLoggingOut = false;
  Timer? _timer;
  late Map<String, dynamic> _currentUserData;
  bool _serviceRunning = false;
  final FlutterBackgroundService service = FlutterBackgroundService();

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
    _currentUserData = Map<String, dynamic>.from(widget.userData);

    _timer = Timer.periodic(const Duration(seconds: 5), (_) => _fetchStatus());

    // الاستماع لرسائل تحديث البيانات من الخدمة
    service.on('update').listen((event) {
      if (event != null) {
        setState(() {
          _currentUserData = Map<String, dynamic>.from(event);
        });
      }
    });

    service.isRunning().then((value) {
      setState(() {
        _serviceRunning = value;
      });
    });
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    _timer?.cancel();
    super.dispose();
  }

  Future<void> _fetchStatus() async {
    try {
      final res = await http
          .get(Uri.parse('http://172.16.0.1/status?var=json'))
          .timeout(const Duration(seconds: 10));
      if (res.statusCode == 200) {
        final data = json.decode(res.body);
        if (data.containsKey('errors')) return;

        setState(() {
          _currentUserData = {
            'logged_in': data['logged_in'] ?? 'no',
            'username': data['username'] ?? widget.username,
            'mac': _decodeMacAddress(data['mac'] ?? ''),
            'ip': data['ip'] ?? 'غير معروف',
            'bytes_in': _formatBytes(data['bytes_in'] ?? '0'),
            'bytes_out': _formatBytes(data['bytes_out'] ?? '0'),
            'remain_bytes_total': _formatBytes(
              data['remain_bytes_total'] ?? '0',
            ),
            'uptime': _formatUptimeExtended(data['uptime'] ?? '0s'),
            'session_time_left': _formatSessionTimeLeft(
              data['session_time_left'] ?? 'غير محدود',
            ),
          };
        });
      }
    } catch (_) {}
  }

  String _decodeMacAddress(String encodedMac) =>
      encodedMac.replaceAll('%3A', ':');

  String _formatUptimeExtended(String uptime) {
    final regex = RegExp(r'(?:(\d+)d)?(?:(\d+)h)?(?:(\d+)m)?(?:(\d+)s)?');
    final match = regex.firstMatch(uptime);
    if (match == null) return uptime;

    final days = int.tryParse(match.group(1) ?? '0') ?? 0;
    final hours = int.tryParse(match.group(2) ?? '0') ?? 0;
    final minutes = int.tryParse(match.group(3) ?? '0') ?? 0;
    final seconds = int.tryParse(match.group(4) ?? '0') ?? 0;

    String result = '';
    if (days > 0) result += '$days يوم ';
    if (hours > 0) result += '$hours ساعة ';
    if (minutes > 0) result += '$minutes دقيقة ';
    if (seconds > 0) result += '$seconds ثانية';

    return result.trim();
  }

  String _formatSessionTimeLeft(String sessionTimeLeft) {
    if (sessionTimeLeft == 'غير محدود') return sessionTimeLeft;
    return _formatUptimeExtended(sessionTimeLeft);
  }

  Future<void> _startService() async {
    if (_serviceRunning) return;
    await service.startService();
    setState(() => _serviceRunning = true);
  }

 Future<void> _stopService() async {
    if (!_serviceRunning) return;
    await service.invoke('stopService');
    setState(() {
      _serviceRunning = false;
    });
  }

  Future<void> _logout() async {
    setState(() => _isLoggingOut = true);

    await _stopService();

    try {
      final response = await http
          .post(
            Uri.parse('http://172.16.0.1/logout'),
            headers: {'Content-Type': 'application/x-www-form-urlencoded'},
            body: {'username': widget.username},
          )
          .timeout(const Duration(seconds: 10));

      if (response.statusCode == 200 && mounted) {
        Navigator.pushAndRemoveUntil(
          context,
          MaterialPageRoute(builder: (_) => const LoginScreen()),
          (route) => false,
        );
      } else {
        throw Exception('فشل في تسجيل الخروج');
      }
    } catch (e) {
      if (mounted) {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(
            content: Text('حدث خطأ: ${e.toString()}'),
            backgroundColor: Colors.red,
            behavior: SnackBarBehavior.floating,
            shape: RoundedRectangleBorder(
              borderRadius: BorderRadius.circular(10),
            ),
          ),
        );
      }
    } finally {
      if (mounted) setState(() => _isLoggingOut = false);
    }
  }

  @override
  Widget build(BuildContext context) {
    return Directionality(
      textDirection: TextDirection.rtl,
      child: Scaffold(
        backgroundColor: const Color(0xFFF5F7FA),
        appBar: AppBar(
          title: const Text('لوحة التحكم'),
          centerTitle: true,
          elevation: 0,
          backgroundColor: Colors.transparent,
          foregroundColor: const Color(0xFF2E384D),
          automaticallyImplyLeading: false,
          actions: [
            IconButton(
              icon: const Icon(Icons.refresh_rounded),
              tooltip: 'تحديث البيانات',
              onPressed: _fetchStatus,
            ),
          ],
        ),
        body: SafeArea(
          child: Padding(
            padding: const EdgeInsets.all(16),
            child: Column(
              children: [
                ElevatedButton(
                  onPressed: _serviceRunning ? null : _startService,
                  child: const Text('تشغيل الخدمة في الخلفية'),
                ),
                ElevatedButton(
                  onPressed: _serviceRunning ? _stopService : null,
                  child: const Text('إيقاف الخدمة'),
                ),
                const SizedBox(height: 20),
                _buildModernUserCard(context),
                const SizedBox(height: 24),
                Expanded(
                  child: GridView.count(
                    crossAxisCount: 2,
                    childAspectRatio: 1.1,
                    crossAxisSpacing: 16,
                    mainAxisSpacing: 16,
                    children: [
                      _buildModernStatCard(
                        icon: Icons.timer_rounded,
                        title: 'مدة الاتصال',
                        value: _currentUserData['uptime'] ?? 'غير معروف',
                        color: const Color(0xFF3366FF),
                      ),
                      _buildModernStatCard(
                        icon: Icons.download_rounded,
                        title: 'البيانات المستلمة',
                        value: _currentUserData['bytes_in'] ?? '0',
                        color: const Color(0xFF00C1D4),
                      ),
                      _buildModernStatCard(
                        icon: Icons.upload_rounded,
                        title: 'البيانات المرسلة',
                        value: _currentUserData['bytes_out'] ?? '0',
                        color: const Color(0xFFFF8A34),
                      ),
                      _buildModernStatCard(
                        icon: Icons.access_time_filled_rounded,
                        title: 'الوقت المتبقي',
                        value:
                            _currentUserData['session_time_left'] ??
                            'غير محدود',
                        color: const Color(0xFF50B83C),
                      ),
                      _buildModernStatCard(
                        icon: Icons.data_usage_rounded,
                        title: 'البيانات المتبقية',
                        value: _currentUserData['remain_bytes_total'] ?? '0',
                        color: const Color(0xFF9C6ADE),
                      ),
                      _buildModernStatCard(
                        icon: Icons.network_check_rounded,
                        title: 'حالة الاتصال',
                        value: 'نشط',
                        color: const Color(0xFFF7C948),
                      ),
                    ],
                  ),
                ),
                const SizedBox(height: 16),
                SizedBox(
                  width: double.infinity,
                  child: ElevatedButton.icon(
                    onPressed: _isLoggingOut ? null : _logout,
                    style: ElevatedButton.styleFrom(
                      backgroundColor: const Color(0xFFFF453A),
                      foregroundColor: Colors.white,
                      padding: const EdgeInsets.symmetric(vertical: 16),
                      shape: RoundedRectangleBorder(
                        borderRadius: BorderRadius.circular(12),
                      ),
                      elevation: 0,
                    ),
                    icon:
                        _isLoggingOut
                            ? const SizedBox(
                              width: 20,
                              height: 20,
                              child: CircularProgressIndicator(
                                color: Colors.white,
                                strokeWidth: 2,
                              ),
                            )
                            : const Icon(Icons.logout_rounded, size: 20),
                    label: Text(
                      _isLoggingOut ? 'جاري تسجيل الخروج...' : 'تسجيل الخروج',
                      style: const TextStyle(
                        fontSize: 16,
                        fontWeight: FontWeight.bold,
                      ),
                    ),
                  ),
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }

  Widget _buildModernUserCard(BuildContext context) {
    return Container(
      decoration: BoxDecoration(
        borderRadius: BorderRadius.circular(16),
        color: Colors.white,
        boxShadow: [
          BoxShadow(
            color: Colors.grey.withOpacity(0.1),
            blurRadius: 10,
            offset: const Offset(0, 5),
          ),
        ],
      ),
      child: Padding(
        padding: const EdgeInsets.all(16),
        child: Column(
          children: [
            Row(
              children: [
                Container(
                  width: 60,
                  height: 60,
                  decoration: BoxDecoration(
                    color: const Color(0xFF3366FF).withOpacity(0.1),
                    shape: BoxShape.circle,
                  ),
                  child: const Icon(
                    Icons.person_rounded,
                    size: 30,
                    color: Color(0xFF3366FF),
                  ),
                ),
                const SizedBox(width: 16),
                Expanded(
                  child: Column(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: [
                      Text(
                        _currentUserData['username'] ?? widget.username,
                        style: const TextStyle(
                          fontSize: 18,
                          fontWeight: FontWeight.bold,
                          fontFamily: 'Tajawal',
                          color: Color(0xFF2E384D),
                        ),
                        maxLines: 1,
                        overflow: TextOverflow.ellipsis,
                      ),
                      const SizedBox(height: 4),
                      const Text(
                        'مستخدم Hotspot',
                        style: TextStyle(
                          fontSize: 14,
                          color: Color(0xFF8798AD),
                          fontFamily: 'Tajawal',
                        ),
                      ),
                    ],
                  ),
                ),
              ],
            ),
            const SizedBox(height: 16),
            Divider(color: Colors.grey.withOpacity(0.2), height: 1),
            const SizedBox(height: 12),
            _buildModernInfoRow(
              Icons.wifi_rounded,
              'عنوان IP:',
              _currentUserData['ip'] ?? 'غير معروف',
              const Color(0xFF2E384D),
            ),
            _buildModernInfoRow(
              Icons.device_hub_rounded,
              'عنوان MAC:',
              _currentUserData['mac'] ?? 'غير معروف',
              const Color(0xFF2E384D),
            ),
          ],
        ),
      ),
    );
  }

  Widget _buildModernInfoRow(
    IconData icon,
    String label,
    String value,
    Color color,
  ) {
    return Padding(
      padding: const EdgeInsets.symmetric(vertical: 8),
      child: Row(
        children: [
          Icon(icon, size: 20, color: color.withOpacity(0.6)),
          const SizedBox(width: 12),
          Text(
            label,
            style: TextStyle(
              fontWeight: FontWeight.bold,
              fontFamily: 'Tajawal',
              fontSize: 15,
              color: color.withOpacity(0.8),
            ),
          ),
          const SizedBox(width: 8),
          Expanded(
            child: Text(
              value,
              style: TextStyle(
                color: color,
                overflow: TextOverflow.ellipsis,
                fontFamily: 'Tajawal',
              ),
            ),
          ),
        ],
      ),
    );
  }

  Widget _buildModernStatCard({
    required IconData icon,
    required String title,
    required String value,
    required Color color,
  }) {
    return Container(
      decoration: BoxDecoration(
        color: Colors.white,
        borderRadius: BorderRadius.circular(16),
        boxShadow: [
          BoxShadow(
            color: Colors.grey.withOpacity(0.1),
            blurRadius: 10,
            offset: const Offset(0, 5),
          ),
        ],
      ),
      child: Padding(
        padding: const EdgeInsets.all(16),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Container(
              padding: const EdgeInsets.all(10),
              decoration: BoxDecoration(
                color: color.withOpacity(0.1),
                borderRadius: BorderRadius.circular(12),
              ),
              child: Icon(icon, size: 24, color: color),
            ),
            const SizedBox(height: 12),
            Text(
              value,
              style: const TextStyle(
                fontFamily: 'Tajawal',
                fontSize: 16,
                fontWeight: FontWeight.bold,
                color: Color(0xFF2E384D),
              ),
            ),
            const SizedBox(height: 4),
            Text(
              title,
              style: const TextStyle(
                fontFamily: 'Tajawal',
                fontSize: 13,
                color: Color(0xFF8798AD),
              ),
            ),
          ],
        ),
      ),
    );
  }
}