انتقل إلى المحتوى الرئيسي
البرمجة الإعلانية

البرمجة الإعلانية

اكتب المنطق التجاري بطريقة مشابهة لودجات Stateless.
اجعل طلبات الشبكة تعيد الحساب تلقائياً عند الضرورة واجعل المنطق الخاص بك قابل بسهولة للإعادة/التكوين/الصيانة.

تطبيق أنماط واجهة المستخدم الشائعة بسهولة

تطبيق أنماط واجهة المستخدم الشائعة بسهولة

باستخدام Riverpod، أنماط واجهة المستخدم الشائعة لكن المعقدة مثل "السحب للتحديث"/"البحث أثناء الكتابة"/الخ... هي مجرد بضع أسطر من الكود بعيداً.

جاهزة للأدوات

جاهزة للأدوات

يحسّن Riverpod المترجم من خلال جعل الأخطاء الشائعة خطأ التجميع. كما يوفر قواعس الفحص المخصصة وخيارات إعادة البناء. لديه حتى سطر أوامر لإنشاء الوثائق.

الميزات

  • Declarative programming
  • Native network requests support
  • Automatic loading/error handling
  • Compile safety
  • Type-safe query parameters
  • Test ready
  • Work in plain Dart (servers/CLI/...)
  • Easily combinable states
  • Built-in support for pull-to-refresh
  • Custom lint rules
  • Built-in refactorings
  • Hot-reload support
  • Logging
  • Websocket support
  • Documentation generator

أعلن الحالة المشتركة من أي مكان

لا تحتاج للقفز بين ملفات main.dart وملفات واجهة المستخدم الخاصة بك بعد الآن.
ضع كود الحالة المشتركة حيث ينتمي، سواء في حزمة منفصلة أو بجانب الودجة التي تحتاجها، دون فقدان القابلية للاختبار.

// A shared state that can be accessed by multiple widgets at the same time.

class Count extends _$Count {

int build() => 0;

void increment() => state++;
}

// Consumes the shared state and rebuild when it changes
class Title extends ConsumerWidget {

Widget build(BuildContext context, WidgetRef ref) {
final count = ref.watch(countProvider);
return Text('$count');
}
}

احسب الحالات/أعد بناء واجهة المستخدم فقط عند الحاجة

لا تضطر بعد الآن إلى فرز/تصفية القوائم داخل طريقة build أو اللجوء إلى آليات التخزين المؤقت المتقدمة.

مع Provider و "families"، قم بفرز القوائم أو إجراء طلبات HTTP فقط عندما تحتاج truly إليها.


List<Todo> filteredTodos(Ref ref) {
// Providers can consume other providers using the "ref" object.
// With ref.watch, providers will automatically update if the watched values changes.
final List<Todo> todos = ref.watch(todosProvider);
final Filter filter = ref.watch(filterProvider);

switch (filter) {
case Filter.all:
return todos;
case Filter.completed:
return todos.where((todo) => todo.completed).toList();
case Filter.uncompleted:
return todos.where((todo) => !todo.completed).toList();
}
}

بسّط العمل اليومي مع عمليات إعادة البناء

يوفر Riverpod عمليات إعادة بناء مختلفة، مثل "التفاف الودجة في Consumer" والعديد غيرها. اطلع على قائمة عمليات إعادة البناء.

بسّط العمل اليومي مع عمليات إعادة البناء

حافظ على كودك قابل للصيانة باستخدام قواعد الفحص

تم تنفيذ قواعد فحص جديدة خاصة بـ Riverpod ويتم إضافة المزيد بشكل مستمر. هذا يضمن بقاء الكود في أفضل الظروف. اطلع على قائمة قواعد الفحص.

حافظ على كودك قابل للصيانة باستخدام قواعد الفحص

اقرأ الموفرين بأمان

قراءة موفر لن تؤدي أبداً إلى حالة سيئة. إذا كان بإمكانك كتابة الكود اللازم لقراءة موفر، ستحصل على قيمة صحيحة.

هذا ينطبق حتى على القيم المحملة بشكل غير متزامن. بخلاف الموفر، يسمح Riverpod بمعالجة حالات التحميل/الخطأ بنظافة.


Future<Configuration> configurations(Ref ref) async {
final uri = Uri.parse('configs.json');
final rawJson = await File.fromUri(uri).readAsString();

return Configuration.fromJson(json.decode(rawJson));
}

class Example extends ConsumerWidget {

Widget build(BuildContext context, WidgetRef ref) {
final configs = ref.watch(configurationsProvider);

// Use pattern matching to safely handle loading/error states
return switch (configs) {
AsyncData(:final value) => Text('data: ${value.host}'),
AsyncError(:final error) => Text('error: $error'),
_ => const CircularProgressIndicator(),
};
}
}

فحص الحالة في أداة المطور

باستخدام Riverpod، تكون الحالة مرئية بشكل افتراضي داخل أداة Flutter dev.
علاوة على ذلك، مفتش حالة كامل قيد التطوير.

فحص الحالة في أداة المطور