سرمایه گذاری متفاوت در سال نو 🍎🌱 ۳۵٪ تخفیف نوروزی ➕ حضور رایگان در مسترمایند نخبگان صنعت نرم‌افزار 💻✅
۰ ثانیه
۰ دقیقه
۰ ساعت
۲ محمد علی
تفکیک خطا‌ها از هم
یلدا محصلی حل شده توسط یلدا محصلی

من می‌خوام که یه کاری کنم وقتی مثلا اینترنت متصل نبود و کار بر در صفحه  ورود یا ثبت نام کلیک کرد به او پیام خطا بدهد که اینترنت متصل نیست و اگر کاربرد در صفحه ورود اطلاعات نادرست وارد کرد به او پیام نادرست بودن اطلاعات را بدهم و همچنین در صفحه ثبت نام اگر کاربر ثبت نام کرده بود به او بگویید که ثبت نام قبلا انجام شده برای تفکیک این دو پیام خطا در این موارد یک راهنمایی بکنید لطفا نمونه کد هم نشون بدید اگه توضیح پیچیده شد

در رابطه با چنین سوالات گسترده‌ای برای اینکه سریع‌تر به نتیجه برسید و جواب بگیرید، پیشنهاد می‌کنم ابتدا از منابعی مثل گوگل یا ابزارهای هوش مصنوعی استفاده کنید. اگر به جواب نرسیدید، و هنوز ابهامی بود، در خدمتم. مثلا  avalai یک پلتفرم ایرانی هست که اگر با ابزارهای انگلیسی زبان راحت نیستید میتونید ازش استفاده کنید.

 

یلدا محصلی ۰۸ اسفند ۱۴۰۳، ۰۶:۲۸

راه‌حل کلی:

چک کردن اینترنت: وقتی کاربر دکمه ورود یا ثبت‌نام رو می‌زنه، اول اتصال اینترنت رو چک می‌کنیم. اگه نباشه، یه پیام خطا (مثلاً SnackBar یا AlertDialog) نشون می‌دیم.

ورود با اطلاعات نادرست: اگه اطلاعات اشتباه بود (مثلاً سرور برگردوند که یوزر یا پسورد غلطه)، یه پیام خطای مشخص می‌دیم.

ثبت‌نام تکراری: اگه کاربر قبلاً ثبت‌نام کرده (مثلاً سرور گفت "این ایمیل قبلاً وجود داره")، یه پیام متفاوت نشون می‌دیم.

تفکیک پیام‌ها: با شرط‌های ساده و متن‌های واضح، این خطاها رو از هم جدا می‌کنیم.

نمونه کد با فلاتر:

فرض می‌کنیم از connectivity_plus برای چک کردن اینترنت و http برای ارتباط با سرور استفاده می‌کنی.

 

۱. نصب پلاگین‌ها در pubspec.yaml:

dependencies:
  flutter:
    sdk: flutter
  connectivity_plus: ^5.0.2

۲. کد صفحه ورود و ثبت‌نام:

import 'package:flutter/material.dart';
import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:http/http.dart' as http;
void main() {
  runApp(MyApp());
}
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: LoginPage(),
    );
  }
}
class LoginPage extends StatefulWidget {
  @override
  _LoginPageState createState() => _LoginPageState();
}
class _LoginPageState extends State<LoginPage> {
  final TextEditingController emailController = TextEditingController();
  final TextEditingController passwordController = TextEditingController();
  bool isRegistering = false; // برای جابه‌جایی بین ورود و ثبت‌نام
  // تابع چک کردن اینترنت
  Future<bool> checkInternet() async {
    var connectivityResult = await (Connectivity().checkConnectivity());
    return connectivityResult != ConnectivityResult.none;
  }
  // تابع ارسال درخواست به سرور (ورود یا ثبت‌نام)
  Future<void> submitForm() async {
    // چک کردن اینترنت
    bool hasInternet = await checkInternet();
    if (!hasInternet) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text("اینترنت متصل نیست!")),
      );
      return;
    }
    // فرض می‌کنیم این API خیالیه
    String url = isRegistering
        ? "https://example.com/register"
        : "https://example.com/login";
    var response = await http.post(
      Uri.parse(url),
      body: {
        "email": emailController.text,
        "password": passwordController.text,
      },
    );
    // بررسی پاسخ سرور
    if (response.statusCode == 200) {
      // موفقیت
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text(isRegistering ? "ثبت‌نام موفق!" : "ورود موفق!")),
      );
    } else if (response.statusCode == 401) {
      // اطلاعات نادرست (ورود)
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text("ایمیل یا رمز عبور نادرست است")),
      );
    } else if (response.statusCode == 409 && isRegistering) {
      // ثبت‌نام تکراری
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text("این ایمیل قبلاً ثبت‌نام کرده است")),
      );
    } else {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text("خطایی رخ داد، دوباره امتحان کن")),
      );
    }
  }

 

  @override
 Widget build(BuildContext context) {
   return Scaffold(
     appBar: AppBar(title: Text(isRegistering ? "ثبت‌نام" : "ورود")),
     body: Padding(
       padding: EdgeInsets.all(16.0),
       child: Column(
         children: [
           TextField(
             controller: emailController,
             decoration: InputDecoration(labelText: "ایمیل"),
           ),
           TextField(
             controller: passwordController,
             decoration: InputDecoration(labelText: "رمز عبور"),
             obscureText: true,
           ),
           SizedBox(height: 20),
           ElevatedButton(
             onPressed: submitForm,
             child: Text(isRegistering ? "ثبت‌نام" : "ورود"),
           ),
           TextButton(
             onPressed: () {
               setState(() {
                 isRegistering = !isRegistering;
               });
             },
             child: Text(isRegistering ? "ورود" : "ثبت‌نام"),
           ),
         ],
       ),
     ),
   );
 }
}
بهترین پاسخ
یلدا محصلی ۰۸ اسفند ۱۴۰۳، ۰۶:۳۰