TKK_E32221098/lib/menu_page/overview/editplant.dart

183 lines
8.6 KiB
Dart

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:seedina/provider/rtdb_handler.dart'; //
import 'package:seedina/utils/rewidgets/global/editingplant/presetparam.dart'; //
import 'package:seedina/utils/rewidgets/global/myappbar.dart'; //
import 'package:seedina/utils/rewidgets/global/editingplant/manualparam.dart'; //
import 'package:seedina/utils/style/gcolor.dart'; //
class EditPlants extends StatefulWidget {
const EditPlants({super.key});
@override
State<EditPlants> createState() => _EditPlantsState();
}
class _EditPlantsState extends State<EditPlants> {
String? _localSelectedPlantForDropdown;
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
final provider = Provider.of<HandlingProvider>(context, listen: false);
// Gunakan draftSelectedPlantForEditing dari provider sebagai nilai awal untuk dropdown
// Provider sudah memiliki logika fallback jika draft kosong atau active kosong.
String initialDropdownValue = provider.draftSelectedPlantForEditing;
// Jika draftSelectedPlantForEditing masih kosong setelah inisialisasi provider (jarang terjadi)
// atau jika nilainya tidak valid (misal tidak ada di list plantsList),
// coba ambil dari activeSelectedPlant atau fallback ke preset pertama.
final plantsList = provider.parameters.keys.toList();
if (initialDropdownValue.isEmpty || !plantsList.contains(initialDropdownValue)) {
if (provider.activeSelectedPlant.isNotEmpty && plantsList.contains(provider.activeSelectedPlant)) {
initialDropdownValue = provider.activeSelectedPlant;
} else if (plantsList.isNotEmpty) {
initialDropdownValue = plantsList.firstWhere((p) => p != "Kustom", orElse: () => plantsList.first);
}
}
// PENTING: Panggil selectPlantForEditingPage agar draft di provider juga sinkron
// dengan apa yang akan ditampilkan dropdown.
// Ini menangani kasus di mana draft mungkin belum diset ke nilai yang valid
// atau perlu disesuaikan (misal, dari Kustom aktif ke form Kustom).
if (initialDropdownValue.isNotEmpty && provider.draftSelectedPlantForEditing != initialDropdownValue) {
provider.selectPlantForEditingPage(initialDropdownValue);
}
// Update state lokal dropdown
setState(() {
_localSelectedPlantForDropdown = initialDropdownValue.isNotEmpty ? initialDropdownValue : (plantsList.isNotEmpty ? plantsList.first : null);
});
});
}
@override
Widget build(BuildContext context) {
return Consumer<HandlingProvider>(
builder: (context, provider, child) {
final plantsList = provider.parameters.keys.toList();
// _localSelectedPlantForDropdown sekarang di-update di initState atau saat onChanged
// Kita bisa langsung menggunakan provider.draftSelectedPlantForEditing untuk value dropdown
// karena provider yang akan menjadi "source of truth" untuk pilihan draft.
// Namun, untuk menghindari rebuild loop, kita tetap pakai _localSelectedPlantForDropdown
// dan hanya update dari provider.draftSelectedPlantForEditing jika ada perubahan signifikan.
String? valueForDropdown = _localSelectedPlantForDropdown;
// Jika nilai lokal tidak ada di daftar (misal setelah provider load dan mengubah list),
// atau jika draft di provider berubah, sinkronkan.
if ((valueForDropdown == null || !plantsList.contains(valueForDropdown)) && plantsList.isNotEmpty) {
valueForDropdown = provider.draftSelectedPlantForEditing.isNotEmpty && plantsList.contains(provider.draftSelectedPlantForEditing)
? provider.draftSelectedPlantForEditing
: plantsList.firstWhere((p) => p != "Kustom", orElse: () => plantsList.first);
// Update state lokal di post frame callback untuk menghindari error build
WidgetsBinding.instance.addPostFrameCallback((_) {
if (mounted && _localSelectedPlantForDropdown != valueForDropdown) {
setState(() {
_localSelectedPlantForDropdown = valueForDropdown;
});
// Tidak perlu panggil provider.selectPlantForEditingPage di sini lagi
// karena sumber perubahan kemungkinan dari provider itu sendiri atau initState.
}
});
}
// Tambahan: Jika provider.draftSelectedPlantForEditing berubah (misal setelah simpan),
// update _localSelectedPlantForDropdown
if (provider.draftSelectedPlantForEditing != _localSelectedPlantForDropdown &&
plantsList.contains(provider.draftSelectedPlantForEditing)) {
WidgetsBinding.instance.addPostFrameCallback((_) {
if (mounted) {
setState(() {
_localSelectedPlantForDropdown = provider.draftSelectedPlantForEditing;
});
}
});
}
return Scaffold(
resizeToAvoidBottomInset: false,
backgroundColor: Color(0XFF5B913B),
appBar: CustomAppBar( //
title: Text(
'Edit Parameter Tanaman',
style: TextStyle(
fontWeight: FontWeight.w900,
fontFamily: 'Quicksand',
color: GColors.myKuning), //
),
actions: [],
showBackButton: true),
body: Column(
children: [
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 16),
child: Container(
padding: EdgeInsets.symmetric(horizontal: 12, vertical: 4),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(16)
),
child: DropdownButtonFormField<String>(
value: valueForDropdown, // Gunakan _localSelectedPlantForDropdown
items: plantsList
.map((plant) => DropdownMenuItem(
value: plant,
child: Text(plant),
))
.toList(),
onChanged: (newValue) {
if (newValue != null) {
setState(() {
_localSelectedPlantForDropdown = newValue; // Update state lokal
});
provider.selectPlantForEditingPage(newValue); // Beritahu provider
}
},
isExpanded: true,
icon: Icon(Icons.arrow_drop_down, color: GColors.myBiru,), //
decoration: InputDecoration(
labelText: 'Pilih Tanaman Anda',
labelStyle: TextStyle(color: GColors.myBiru.withOpacity(0.9)), //
border: InputBorder.none,
),
),
),
),
SizedBox(height: 8),
Expanded(
child: Container(
width: MediaQuery.of(context).size.width,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.only(topLeft: Radius.circular(16), topRight: Radius.circular(16)),
),
child: SingleChildScrollView(
child: Padding(
padding: EdgeInsets.only(left: 16, right: 16, top: 16, bottom: 16 + MediaQuery.of(context).viewInsets.bottom),
child: Column(
children: [
if (provider.isLoading && _localSelectedPlantForDropdown == null)
Center(child: CircularProgressIndicator())
else if (_localSelectedPlantForDropdown == 'Kustom') // Bandingkan dengan state lokal
EditInfo() //
else if (_localSelectedPlantForDropdown != null && _localSelectedPlantForDropdown!.isNotEmpty)
PresetParameter() //
else
Center(child: Text("Pilih tanaman dari dropdown.", style: TextStyle(color: Colors.grey)))
],
),
),
),
),
),
],
),
);
},
);
}
}