183 lines
8.6 KiB
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)))
|
|
],
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
},
|
|
);
|
|
}
|
|
} |