🙂 İNSANLARIN EN HAYIRLISI INSANLARA FAYDALI OLANDIR 🙂

Ramazan HABER / FLUTTER / dynamic dinamik widget kullanımı gönderilen jsona göre textformfield oluşur yeni ekle ve düzenle için kullanılır

1-) FLUTTER - dynamic dinamik widget kullanımı gönderilen jsona göre textformfield oluşur yeni ekle ve düzenle için kullanılır

 

 

KULLANIMI

print('Yeni butonuna basıldı');
String newJson =
"{\"id\": \"0\", \"ad\": \"\"}";
_handleNewAction(newJson);

 

 

 

void _handleNewAction(String jsonverim) {

  showDialog(
    context:
context,
    builder: (BuildContext context) {
      
return YeniDuzenlePage(
        jsonData:jsonDecode(jsonverim) ,
        onSave: (datarow) {
          print(datarow);

          String json = jsonEncode(datarow);


          
if(datarow["id"].toString()==0){
            
api.addAnaArizaIstekTanim(json).then((value) {
              yenile();
            });
          }
else{
            
api.updateAnaArizaIstekTanim(json).then((value) {
              yenile();
            });
          }

        }, tittle: SabitText.
anaarizaistektanim,
      );
    },
  );
}

 

 

KOD

 

 

import 'package:flutter/material.dart';

class YeniDuzenlePage extends StatefulWidget {
  
final Map<String, dynamic> jsonData;
  
final Function(Map<String, dynamic>) onSave;
  
final String tittle;

  YeniDuzenlePage(
      {
required this.tittle, required this.jsonData, required this.onSave});

  
@override
  
_YeniDuzenlePageState createState() => _YeniDuzenlePageState();
}

class _YeniDuzenlePageState extends State<YeniDuzenlePage> {
  
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
  List<Widget>
_inputWidgets = [];
  Map<String,
dynamic> selectedDropdownValues =
      {};
// Store selected dropdown values

  
@override
  
void initState() {
    
super.initState();
    _initializeInputWidgets();
  }

  
void _initializeInputWidgets() {
    
_inputWidgets = [];
    
widget.jsonData.forEach((key, value) {
      
if (value is List) {
        
// Eğer alan bir liste ise DropdownButtonFormField oluştur
        
List<Map<String, dynamic>> options = value.cast<Map<String, dynamic>>();
        String selectedValue =
            options.
isNotEmpty ? options[0]["id"].toString() : "0";

        
var selectedOption =
            options.where((element) => element[
"selected"] == 1).firstOrNull;
        
if (selectedOption != null) {
          selectedValue = selectedOption[
"id"].toString();
        }

        
selectedDropdownValues[key] =
            selectedValue;
// Initialize with default value

        
_inputWidgets.add(DropdownButtonFormField<String>(
          value:
selectedDropdownValues[key], // Use selected value from the map
          
onChanged: (newValue) {
            setState(() {
              
selectedDropdownValues[key] = newValue!;
            });
          },
          items: options.map((option) {
            
return DropdownMenuItem<String>(
              value: option[
"id"].toString(),
              child:
Text(option["ad"]),
            );
          }).toList(),
          decoration:
InputDecoration(
            labelText: key,
          ),
        ));
      }
else {
        
// Diğer alanlar için TextFormField oluştur

        
TextEditingController controller =
            
TextEditingController(text: value.toString());

        
var inputWidget= TextFormField(
          controller: controller,
          decoration:
InputDecoration(
            labelText: key,
          ),
        );

        
if(key == "id"){
          inputWidget=
TextFormField(
            controller: controller,
            enabled:
false,
            decoration:
InputDecoration(
              labelText: key,
            ),
          );
        }

        
_inputWidgets.add(inputWidget);




      }
    });
  }

  
@override
  
void dispose() {
    
super.dispose();
  }

  
@override
  
Widget build(BuildContext context) {
    
return AlertDialog(
      title:
Text(widget.tittle),
      content:
Container(
        height:
500,
        width:
500,
        child:
Form(
          key:
_formKey,
          child:
GridView.builder(
            gridDelegate:
SliverGridDelegateWithFixedCrossAxisCount(
              crossAxisCount:
4, // Sütun sayısı burada belirlenir
            
),
            itemCount:
_inputWidgets.length,
            itemBuilder: (context, index) {
              
return Container(
                padding:
EdgeInsets.only(left: 10),
                child:
_inputWidgets[index],
              );
            },
          ),
        ),
      ),
      actions: <Widget>[
        
TextButton(
          onPressed: () {
            Navigator.
of(context).pop();
          },
          child:
Text("İptal"),
        ),
        
TextButton(
          onPressed: () {
            
if (_formKey.currentState!.validate()) {
              Map<String,
dynamic> newData = {};

              
for (int index = 0; index < _inputWidgets.length; index++) {
                String key =
widget.jsonData.keys.elementAt(index);
                Widget inputWidget =
_inputWidgets[index];

                
if (inputWidget is DropdownButtonFormField) {
                  
// Eğer alan bir DropdownButtonFormField ise seçilen değeri al
                  
newData[key] = int.parse(selectedDropdownValues[key] ?? "0");
                }
else if (inputWidget is TextFormField) {
                  
// Diğer alanlar için değerleri al
                  
newData[key] = inputWidget.controller?.text;
                }
              }

              
widget.onSave(newData);
              Navigator.
of(context).pop();
            }
          },
          child:
Text("Kaydet"),
        ),
      ],
    );
  }
}

 

 

 

 

 

 2023 Kasım 03 Cuma
 261