DXCode - Code Repository
66 subscribers
1 link
Download Telegram
🍎 نکته iOS:
در ios‌ نمیشه مستقیم پکیج‌ها رو بررسی کرد، واسه همین شرط سیستم عامل گذاشتم و یه تکه کد که چک میکنه سیب اپ قابل باز شدن هست یا نه که باید این کد رو هم به این مسیر
ios/Runner/Info.plist
داخل تگ <dict/> اضافه کنید

<key>LSApplicationQueriesSchemes</key>
<array>
<string>sibapp</string>
</array>


🤖 نکته اندروید: واسه اندروید ۱۱ به بعد باید
تگ </queries> که پکیج‌ نیم‌ها داخلش هست رو به مانیفست اضافه کنید.

<queries>
<package android:name="com.farsitel.bazaar"/>
<package android:name="ir.divar"/>
<package android:name="com.mtni.myirancell"/>
<package android:name="com.mobiliha.badesaba"/>
<package android:name="iResources.mci.ecareapp"/>
<package android:name="net.telewebion"/>
<package android:name="iResources.balad"/>
<package android:name="com.digikala"/>
<package android:name="com.aparat"/>
<package android:name="cab.snapp.passenger"/>
<package android:name="com.farakav.anten"/>
<package android:name="iResources.hafhashtad.android780"/>
<package android:name="com.taxsee.taxsee"/>
<package android:name="com.sheypoor.mobile"/>
<package android:name="ir.shahbaz.SHZToolBox"/>
<package android:name="ir.resaneh1.iptv"/>
<package android:name="com.shatelland.namava.mobile"/>
<package android:name="com.aparat.filimo"/>
<package android:name="com.khorasannews.latestnews"/>
<package android:name="com.adpdigital.mbs.ayande"/>
<package android:name="ir.bmi.bam.nativeweb"/>
<package android:name="com.pmb.mobile"/>
<package android:name="com.isc.bsinew"/>
<package android:name="ir.tejaratbank.tata.mobile.android.tejarat"/>
<package android:name="com.postbank.mb"/>
<package android:name="com.ada.mbank.mehr"/>
<package android:name="mob.banking.android.sepah"/>
<package android:name="mob.banking.android.pasargad"/>
<package android:name="com.ada.mbank.parsian"/>
<package android:name="com.pooyabyte.mb.android"/>
<package android:name="org.rajman.neshan.traffic.tehran.navigator"/>
<package android:name="taxi.tap30.driver"/>
<package android:name="com.zoodfood.android"/>
<package android:name="ir.mservices.market"/>
</queries>؛
Please open Telegram to view this post
VIEW IN TELEGRAM
🔨 FarsiUserChecker | کد کلاس چکر

class FarsiUserChecker {
FarsiUserChecker._();

static const List<String> farsiAndroidPackages = [
"com.farsitel.bazaar", "ir.divar", "com.mtni.myirancell","com.mobiliha.badesaba", "iResources.mci.ecareapp", "net.telewebion", "iResources.balad", "com.digikala", "com.aparat", "cab.snapp.passenger","com.farakav.anten", "iResources.hafhashtad.android780", "com.taxsee.taxsee", "com.sheypoor.mobile", "ir.shahbaz.SHZToolBox", "ir.resaneh1.iptv","com.shatelland.namava.mobile", "com.aparat.filimo", "com.khorasannews.latestnews", "com.adpdigital.mbs.ayande", "ir.bmi.bam.nativeweb","com.pmb.mobile", "com.isc.bsinew", "ir.tejaratbank.tata.mobile.android.tejarat", "com.postbank.mb", "com.ada.mbank.mehr", "mob.banking.android.sepah","mob.banking.android.pasargad", "com.ada.mbank.parsian", "com.pooyabyte.mb.android", "org.rajman.neshan.traffic.tehran.navigator","taxi.tap30.driver", "com.zoodfood.android", "ir.mservices.market",
];

static Future<bool> _hasInstalledRelevantApp() async {

if (Platform.isAndroid) {
try {
for (var pkg in farsiAndroidPackages) {
bool? isInstalled = await InstalledApps.isAppInstalled(pkg);
if (isInstalled == true) return true;
}
return false;

} catch (e) {
Logger(printer: SimplePrinter(colors: true)).e('Error checking installed app: $e');
return false;
}

} else if (Platform.isIOS) {
return await canLaunchUrl(Uri.parse('sibapp://'));
} else {
return false;
}
}

static bool _isDeviceLanguageFarsi() {
final preferredLocales = PlatformDispatcher.instance.locales;
return preferredLocales.any((locale) => ['fa', 'prs'].contains(locale.languageCode.toLowerCase()));
}

static bool _isDeviceCountryIranOrAfghanistan() {
final List<Locale> preferredLocales = PlatformDispatcher.instance.locales;
return preferredLocales.any((locale) {
final countryCode = locale.countryCode;
return countryCode != null && (countryCode.toUpperCase() == 'IR' countryCode.toUpperCase() == 'AF');
});
}

static Future<bool> _isDeviceInIranOrAfghanistanTimeZone() async {
try {
final timezone = await FlutterNativeTimezoneLatest.getLocalTimezone();
return timezone == 'Asia/Tehran' timezone == 'Asia/Kabul';
} catch (e) {
return false;
}
}

static Future<bool> isFarsiUser() async {
if (_isDeviceLanguageFarsi()) return true;
if (_isDeviceCountryIranOrAfghanistan()) return true;
if (await _isDeviceInIranOrAfghanistanTimeZone()) return true;
if (await _hasInstalledRelevantApp()) return true;
return false;
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
🔨نمونه کد:

debugPrint('\x1B[31m $NAME$ \x1B[0m');
// red
debugPrint('\x1B[33m $NAME$ \x1B[0m');
// yellow
debugPrint('\x1B[32m $NAME$ \x1B[0m');
// green
debugPrint('\x1B[35m $NAME$ \x1B[0m');
// purple
debugPrint('\x1B[36m $NAME$ \x1B[0m');
// Turquoise
Please open Telegram to view this post
VIEW IN TELEGRAM
😎 Android Studio / IntelliJ:

1. مسیر:
Preferences > Editor > Live Templates
2. روی Flutter کلیک کن و + بزن
3. بخش Abbreviation بنویس: مثلاً redlog
4. توی Template Text بذار:

debugPrint('\x1B[31m $NAME$ \x1B[0m');


5.بعد Add variable برای NAME (مثلاً: log)
6.روی Define بزن و Dart رو انتخاب کن
7. ذخیره کن

😎 VS Code (با Snippet):
1. از منو برو به:
Preferences > Configure User Snippets
2. فایل dart.json رو باز کن
3. اینو اضافه کن
"Red Log": {
"prefix": "redlog",
"body": ["debugPrint('\\x1B[31m \$1 \\x1B[0m');"],
"description": "Red colored log"
}


⚙️How to use :
حالا تو کدت‌ اسمی که مشخص کردی بنویس:

redlog


بعد نوشتن Tab بزن تا تبدیل بشه به نمونه زیر

debugPrint('\x1B[31m Test \x1B[0m'); 


حالا فقط جای test، متن مورد نظرت رو بنویس
Please open Telegram to view this post
VIEW IN TELEGRAM
نمونه کد:
Future<void> copyToClipboard(BuildContext context, String text) async {
// کپی کردن متن به کلیپ‌بورد
await Clipboard.setData(ClipboardData(text: text));

bool shouldShowSnackBar = false;

// بررسی پلتفرم برای نمایش Snackbar
if (Platform.isIOS) {
shouldShowSnackBar = true;
} else if (Platform.isAndroid) {
final deviceInfo = DeviceInfoPlugin();
final androidInfo = await deviceInfo.androidInfo;

// فقط اگر SDK کمتر از 31 باشد Snackbar نمایش داده شود
if (androidInfo.version.sdkInt < 31) {
shouldShowSnackBar = true;
}
}

// نمایش Snackbar در صورت لزوم
if (shouldShowSnackBar && context.mounted) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text(
'متن در کلیپ‌بورد کپی شد',
textAlign: TextAlign.center,
),
),
);
}
}
اشتباه:


Column(
children: [
myWidgets, // ارور!
],
);


درست:


Column(
children: [
Text('شروع'),
...myWidgets, // لیست باز می‌شه
Text('پایان'),
],
);


🧩 شرطی هم می‌تونی بنویسی:


if (showList) ...myWidgets


⚙️ ساخت لیست داینامیک از دیتا:


...names.map((n) => Text(n)).toList()
Please open Telegram to view this post
VIEW IN TELEGRAM
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
// این کد بعد از ساخت کامل ویجت اجرا میشه
showDialog(
context: context,
builder: (context) => AlertDialog(
title: Text('Hi!'),
content: Text('ویجت‌ها لود شدن'),
),
);
});
}
class UsersPage extends StatefulWidget {
const UsersPage({Key? key}) : super(key: key);

@override
State<UsersPage> createState() => _UsersPageState();
}

class _UsersPageState extends State<UsersPage> {
late Future<List<User>> _usersFuture;

@override
void initState() {
super.initState();
_usersFuture = fetchUsers(); // فقط یک بار اجرا میشه
}

@override
Widget build(BuildContext context) {
return FutureBuilder<List<User>>(
future: _usersFuture,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const CircularProgressIndicator();
}
if (snapshot.hasError) {
return Text('Error: ${snapshot.error}');
}
final users = snapshot.data ?? [];
return ListView.builder(
itemCount: users.length,
itemBuilder: (_, i) => ListTile(title: Text(users[i].name)),
);
},
);
}
}
bool isButtonClicked = false;

void onButtonPressed() async {
if (isButtonClicked) return; // جلوگیری از دوبار کلیک

isButtonClicked = true;

// اکشن اصلی مثلاً ارسال درخواست
await Future.delayed(const Duration(seconds: 1));
print('Request done!');

isButtonClicked = false;
}
import 'package:connectivity_plus/connectivity_plus.dart';

Future<void> checkConnection() async {
final connectivityResult = await Connectivity().checkConnectivity();

if (connectivityResult == ConnectivityResult.mobile) {
print('Connected via Mobile Data');
} else if (connectivityResult == ConnectivityResult.wifi) {
print('Connected via WiFi');
} else {
print('No Internet Connection');
}
}



برای بررسی لحظه‌ای تغییر اتصال، می‌تونی از stream زیر استفاده کنی:


Connectivity().onConnectivityChanged.listen((result) {
print('Connection changed: $result');
});
class ScrollFabExample extends StatefulWidget {
@override
_ScrollFabExampleState createState() => _ScrollFabExampleState();
}

class _ScrollFabExampleState extends State<ScrollFabExample> {
final ScrollController _controller = ScrollController();
bool _showFab = true;

@override
void initState() {
super.initState();
_controller.addListener(() {
if (_controller.position.userScrollDirection == ScrollDirection.reverse) {
setState(() => _showFab = false);
} else if (_controller.position.userScrollDirection == ScrollDirection.forward) {
setState(() => _showFab = true);
}
});
}

@override
Widget build(BuildContext context) {
return Scaffold(
body: ListView.builder(
controller: _controller,
itemCount: 50,
itemBuilder: (_, i) => ListTile(title: Text("Item $i")),
),
floatingActionButton: AnimatedOpacity(
duration: Duration(milliseconds: 250),
opacity: _showFab ? 1 : 0,
child: FloatingActionButton(
onPressed: () {},
child: Icon(Icons.add),
),
),
);
}
}
import 'package:flutter/services.dart';

void setSystemBars() {
SystemChrome.setSystemUIOverlayStyle(
const SystemUiOverlayStyle(
statusBarColor: Colors.transparent, // شفاف یا هر رنگ دلخواه
statusBarIconBrightness: Brightness.light, // برای آیکون‌های روشن
systemNavigationBarColor: Colors.black, // رنگ نوار پایین
systemNavigationBarIconBrightness: Brightness.light,
),
);
}



و در صفحه موردنظر، مثلاً داخل initState صداش کن:

@override
void initState() {
super.initState();
setSystemBars();
}


نکته مهم:

اگه حالت Dark/Light داری، می‌تونی بسته به تم سیستم رنگ‌ها رو داینامیک تغییر بدی:

final isDark = Theme.of(context).brightness == Brightness.dark;
راه‌حل حرفه‌ای: Global NavigatorKey
🔧 تنظیم اولیه در MaterialApp:
final GlobalKey<NavigatorState> navigatorKey =
GlobalKey<NavigatorState>();

MaterialApp(
navigatorKey: navigatorKey,
home: const HomePage(),
);

🪄 استفاده از context در هرجای اپ:
final context = navigatorKey.currentContext!;

ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Hello from anywhere!')),
);