من میخواهم وقتی روی دکمه save کلیک میکنم(اطلاعات رو ذخیره کردم )به صفحه HomeScreen منتقل بشم و تمام تغییرات در این صفحه پیاده بشه و قابل مشاهده بدون این که نیاز باشه دوباره برنامه رو رفرش کنم تا تغییرات رو ببینم چه کد هایی رو باید پیاده کنم؟
روشهای زیادی براش هست. مثلا میتونید ValueNotifier استفاده کنید یا در ادامه دوره با استفاده از BloC این کار رو انجام بدید و یا سایر state management ها.
یلدا محصلی۳۰ دی ۱۴۰۳، ۱۴:۳۳
چه طور از ValueNotifier استفاده کنم چه کد هایی رو پیاده کنم؟
محمد علی۳۰ دی ۱۴۰۳، ۱۵:۴۹
ValueNotifier کمک میکنه تا تغییرات یه مقدار رو بهراحتی مدیریت کنید و وقتی اون مقدار عوض میشه، به صورت خودکار UI رو بهروزرسانی کنید. هر وقت مقدار value تغییر کنه، همه جاهایی که بهش گوش میدن (مثل ValueListenableBuilder) فوراً واکنش نشون میدن و رفرش میشن.
میتونید از این مثال هم کمک بگیرید اما برای تمرین بهتره کدتون رو خودتون پیادهسازی کنید:
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: FormScreen(),
);
}
}
// ValueNotifier برای مدیریت لیست
final ValueNotifier<List<String>> listNotifier = ValueNotifier<List<String>>([]);
class FormScreen extends StatelessWidget {
final TextEditingController controller = TextEditingController();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("فرم ذخیره اطلاعات")),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: [
TextField(
controller: controller,
decoration: InputDecoration(labelText: "متن خود را وارد کنید"),
),
SizedBox(height: 16),
ElevatedButton(
onPressed: () {
if (controller.text.isNotEmpty) {
// اضافه کردن مقدار جدید به لیست
listNotifier.value = [...listNotifier.value, controller.text];
controller.clear();
// انتقال به صفحه HomeScreen
Navigator.push(
context,
MaterialPageRoute(builder: (context) => HomeScreen()),
);
}
},
child: Text("ذخیره و رفتن به صفحه اصلی"),
),
],
),
),
);
}
}
class HomeScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("صفحه اصلی")),
body: Center(
// استفاده از ValueListenableBuilder برای نمایش لیست
child: ValueListenableBuilder<List<String>>(
valueListenable: listNotifier,
builder: (context, list, child) {
if (list.isEmpty) {
return Text("هنوز دادهای ذخیره نشده است.");
}
return ListView.builder(
itemCount: list.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(list[index]),
);
},
);
},
),
),
);
}
}