إعادة تحميل البيانات بزر
جزء من قسم البيانات والشبكة في رحلة Flutter على Coddy. الدرس 8 من 27.
لتحميل بيانات جديدة، امنح FutureBuilder مستقبلًا جديدًا. أنشئه داخل setState، لكي يُعاد بناء الشاشة باستخدامه:
IconButton(
icon: const Icon(Icons.refresh),
onPressed: () {
setState(() {
_tip = fetch('/tip');
});
},
)تصل النصيحة الجديدة بعد ثانيتين. وأثناء تحميلها، تظل snapshot.hasData تساوي true: تحتفظ أداة البناء بالبيانات القديمة حتى تحل البيانات الجديدة محلها. عند التحقق من hasData، تبقى النصيحة القديمة على الشاشة ولا يظهر ما يدل على أن التطبيق يعمل.
لإظهار مؤشر الانتظار مرة أخرى، تحقّق من snapshot.connectionState لمعرفة حالة المستقبل في الوقت الحالي. تكون قيمته ConnectionState.waiting أثناء تشغيل المستقبل، وConnectionState.done عند اكتماله:
if (snapshot.connectionState == ConnectionState.waiting) {
return const CircularProgressIndicator();
}
return Text(snapshot.data!);بعد اكتماله، تصبح البيانات متاحة، لذا يكون snapshot.data! آمنًا.
التحدي
متوسطأضف زر تحديث يحمّل النصيحة التالية:
- استخدم
IconButtonمعIcons.refreshفيactionsفي الشريط العلوي - عند الضغط عليه، عيّن
_tipإلىfetch('/tip')جديد داخلsetState - يظهر مؤشر التحميل أثناء تحميل النصيحة الجديدة: تحقّق من
snapshot.connectionState
جرّب بنفسك
import 'package:flutter/material.dart';
import 'api.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp(
debugShowCheckedModeBanner: false,
home: TipScreen(),
);
}
}
class TipScreen extends StatefulWidget {
const TipScreen({super.key});
@override
State<TipScreen> createState() => _TipScreenState();
}
class _TipScreenState extends State<TipScreen> {
late Future<String> _tip;
@override
void initState() {
super.initState();
_tip = fetch('/tip');
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Tip of the Day'),
),
body: Center(
child: Padding(
padding: const EdgeInsets.all(24),
child: FutureBuilder<String>(
future: _tip,
builder: (context, snapshot) {
if (snapshot.hasData) {
return Text(
snapshot.data!,
textAlign: TextAlign.center,
style: const TextStyle(fontSize: 24),
);
}
return const CircularProgressIndicator();
},
),
),
),
);
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البيانات والشبكة
2شاشات التحميل
مؤشر دائري أثناء التحميلتعرّف على FutureBuilderجلب البيانات مرة واحدة في initStateإعادة تحميل البيانات بزرالسحب للتحديثتدرّب بنفسك: مترجم Flutter عبر الإنترنت