اذهب إلى المحتوى

السؤال

نشر

السلام عليكم ورحمة الله وبركاته 

تحيه طيبه للجميع.

اقوم ببرمجة صفحة تعديل البيانات من قبل المستخدم المستخدم من خلال هذا الصفحة قادر على تعديل بياناته + الصورة 

الان تغير الصورة شغال ميه ميه ولكن لدي مشكلة بيانات الحقول لا تتغير ولا تعطي اي استجابة الا في حالة وحده اذا كنت عامل اختيار لصورة يعني يجب ان احدث الصورة من اجل تحديث الحقول لم استطيع ايجاد السبب ابد يجب ان اكود قارد على تعديل اوتحديث الحقول بدون تحديث الصورة

ياليت اذا احد لديه فكره وخبره في فلاتر يساعدني

هذا كود الصفحة كامل

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:http/http.dart' as http;
import 'dart:async';
import 'dart:convert';
import 'MyPreferences.dart';
import 'dart:io';
import 'package:image_picker/image_picker.dart';
class Update extends StatefulWidget {
  var getid;
  Update({Key key, this.getid}) : super(key: key);
  @override
  _UpdateState createState() => new _UpdateState();
}

class _UpdateState extends State<Update> {
  bool visibilityController = true;
  MyPreferences _myPreferences = MyPreferences();
  var getid;
  Future<File> file;
  String status = '';
  String base64Image;
  File tmpFile;
  String errMessage = 'Error Uploading Image';

  var data;
  String uploadEndPoint;
  var _username= "";
  var _phone = "";
  var _password = "";
  var image ="";
var extradata="";

 // var _genderController = new TextEditingController();
  var _phoneController = new TextEditingController();
  var _firstnameController = new TextEditingController();
  var _lastnameController = new TextEditingController();
  var _extradataController = new TextEditingController();
  chooseImage() {
    setState(() {
      file = ImagePicker.pickImage(source: ImageSource.gallery);
      visibilityController = false;
    });
    setStatus('');
  }

  setStatus(String message) {
    setState(() {
      status = message;

    });
  }



  Widget showImage() {
    return FutureBuilder<File>(
      future: file,
      builder: (BuildContext context, AsyncSnapshot<File> snapshot) {
        if (snapshot.connectionState == ConnectionState.done &&
            null != snapshot.data) {
          tmpFile = snapshot.data;
          base64Image = base64Encode(snapshot.data.readAsBytesSync());

          return Flexible(
            child: Card(
              child: SizedBox(
                width: 400.0,
                height: 300.0,

              child: Image.file(
                snapshot.data,
                fit: BoxFit.cover,
              ),
            ),
            ),
          );

        } else if (null != snapshot.error) {
          return const Text(
            'Error Picking Image',
            textAlign: TextAlign.center,
          );
        } else {
          return const Text(
            '',
            textAlign: TextAlign.center,
          );
        }
      },

    );

  }
  Future<String> _ShowDialog(String msg) async {
    return showDialog<String>(
      context: context,
      barrierDismissible: false, // user must tap button!
      builder: (BuildContext context) {
        return new AlertDialog(
          title: new Text('Rewind and remember'),
          content: new SingleChildScrollView(
            child: new ListBody(
              children: <Widget>[
                new Text(msg),
              ],
            ),
          ),
          actions: <Widget>[
            new FlatButton(
              child: new Text('Close'),
              onPressed: () {
                Navigator.of(context).pop();
              },
            ),
          ],
        );
      },
    );
  }

  void _editData() async {
    //var date = new DateTime.now().toString();
    String NameImage =DateTime.now().millisecondsSinceEpoch.toString();
    var url = 'http://xxxxxxxxxxx/ModifyProfile.php';

    var response = await http.post(url, body: {

      "id": widget.getid.toString(),

      "name": _firstnameController.text,
     "phone": _phoneController.text,
     "password": _lastnameController.text,
      "NameImage": NameImage,
      "image": base64Image,
      "extradata": _extradataController.text,

    });

    if (response.statusCode == 200) {

      _ShowDialog("Updated Successfully");
    } else {
      _ShowDialog("Updated Failer");
    }

    //onEditedAccount();
    //print(_adresseController.text);
  }

  _fetchData() async {

    final url =
        "http://xxxxxxxxxxx/ConsultProfile.php?id=${widget.getid}";
    final response = await http.get(url);
    if (response.statusCode == 200) {
      final map = json.decode(response.body);
      final videosMap = map["result"];

      setState(() {

        this.data = videosMap;
        _username = data[0]['name'];
        _phone = data[0]['phone'];
        _password = data[0]['password'];
        image = data[0]['image'];
        extradata = data[0]['extradata'];
      //  _gender = data[0]['gender'];
        print(data);
      });
    }
  }

  @override
  void initState() {
    super.initState();
    _fetchData();

  }

  @override
  Widget build(BuildContext context) {
   
    return new Scaffold(
        appBar: AppBar(
          title: Text("Update Profile"),
          backgroundColor: const Color(0xFFf6c626), // status bar color
          brightness: Brightness.light,
        ),
        body: new Center(
          child: data == null
              ? new CircularProgressIndicator()
              : new ListView(
                  children: <Widget>[
          Card(
          child: new Column(
          children: <Widget>[


           Container(
            child: Visibility(
            visible: visibilityController,
            child: Card(
                child: new Column(
                    children: <Widget>[
                      Image.network(image, width: 385,height: 300,
                        fit: BoxFit.cover,
                      ),
                    ]
                )
            ),
          ),
        ),


    Card(
    child: showImage(),
    ),
    OutlineButton(
    onPressed: chooseImage,
    child: Text('Choose Image'),
    ),



            ],
          ),
        ),


Card (
    child: Column(
        children: <Widget>[
          SizedBox(
            height: 10.0,
          ),
    Container(
    margin: EdgeInsets.all(4),

        child: TextField(
          maxLength: 10,
          decoration: InputDecoration(
              border: OutlineInputBorder(),
              labelText: 'Name',
              filled: true,
              hintText: _username),
          controller: _firstnameController,
        ),

    ),
          SizedBox(
            height: 5.0,
          ),
        Container(
            margin: EdgeInsets.all(4),
                          child: TextField(
                            maxLength: 8,
                            decoration: InputDecoration(
                                border: OutlineInputBorder(),
                                labelText: 'Phone number',
                                filled: true,
                                hintText: _phone),
                            controller: _phoneController,
                          ),
        ),
          SizedBox(
            height: 5.0,
          ),
        Container(
            margin: EdgeInsets.all(4),
                          child: TextField(
                            maxLength: 8,
                            decoration: InputDecoration(
                              border: OutlineInputBorder(),
                              labelText: 'Password',
                                filled: true,
                                hintText: _password),
                            controller: _lastnameController,
                          ),

        ),
          SizedBox(
            height: 5.0,
          ),
          SizedBox(
            height: 5.0,
          ),
          Container(
            margin: EdgeInsets.all(4),
            child: TextField(
              maxLength: 8,
              decoration: InputDecoration(
                  border: OutlineInputBorder(),
                  labelText: 'Password',
                  filled: true,
                  hintText: extradata),
              controller: _extradataController,
            ),

          ),
          SizedBox(
            height: 5.0,
          ),

       ]

    )

),

                          SizedBox(
                            width: double.infinity,
                            child: new FlatButton(
                              child: const Text('Update'),color:  const Color(0xFFf6c626),
                              padding: EdgeInsets.fromLTRB(100, 18, 100, 18),
                              onPressed: ()
                              {
                                _editData();

                              },
                            ),
                          ),

                          SizedBox(
                            height: 10.0,
                          ),
                        ],
                      ),



                ),
        );
  }
}

 

Recommended Posts

  • 1
نشر

أهلاً بك أخ مروان .  
في البداية يجب أن تجلب بيانات المستخدم من قاعدة البيانات ، و تخزنها داخل ال textFiled و قم باستخدام الخاصية onChange داخل ال textField  كالتالي :- 

 

TextField(
  onChanged: (name) {
   setState(){
     _name = name ; 
   }
  },
);

بحيث تقوم هذه الخاصية  بتغير قيمة  المتغير _name فور قيام المستخدم بتعديل القيمة داخل الحقل .  
و في كبسة update تقوم بتعديل البيانات التي تم تعديلها ، و التي تم تعدل تبقى كما هي .  
ملاحظة: هناك أكثر من طريقة لتحديث بيانات المستخدم و هذه واحدة منهم و انا استخدمها في معظم الأحيان ،  

  • بالنسبة للصورة 

يجب أن تفصل بين الصورة و الحقول ،  بحيث عندما يحدث المستخدم الصورة الخاصة به يتم تحديها مباشرة في قاعدة البيانات ولا يشترط ان يحدث حقول الإدخال (أظن ان المشكلة لديك بسبب هذه النقطة )

شكراً لك  . 

  • 0
نشر
بتاريخ 19 دقائق مضت قال ماجد قطوسة:

أهلاً بك أخ مروان .  
في البداية يجب أن تجلب بيانات المستخدم من قاعدة البيانات ، و تخزنها داخل ال textFiled و قم باستخدام الخاصية onChange داخل ال textField  كالتالي :- 

 


TextField(
  onChanged: (name) {
   setState(){
     _name = name ; 
   }
  },
);

بحيث تقوم هذه الخاصية  بتغير قيمة  المتغير _name فور قيام المستخدم بتعديل القيمة داخل الحقل .  
و في كبسة update تقوم بتعديل البيانات التي تم تعديلها ، و التي تم تعدل تبقى كما هي .  
ملاحظة: هناك أكثر من طريقة لتحديث بيانات المستخدم و هذه واحدة منهم و انا استخدمها في معظم الأحيان ،  

  • بالنسبة للصورة 

يجب أن تفصل بين الصورة و الحقول ،  بحيث عندما يحدث المستخدم الصورة الخاصة به يتم تحديها مباشرة في قاعدة البيانات ولا يشترط ان يحدث حقول الإدخال (أظن ان المشكلة لديك بسبب هذه النقطة )

شكراً لك  . 

شاكر لك ردك عزيزي وتوضيحك ولكن ي غالي كيف يعني افصل بينهم لم افهم هذا النقطه اعذرني اذا ممكن توضح اكثر انا ارغب بعدم الاشتراط فعلا ولكن هل قصدك نعمل كل شي له زر خاص؟

  • 0
نشر

لاحظت أنك تستخدم ال image_picker و هذا ممتاز ،  ستقوم بما يلي :- 

  1. استخدام دالة تقوم بإختيار الصورة من المعرض  و تمريرها الى دالة أخرى تقوم بتخزينها داخل قاعدة البيانات الخاصة بك . 
      Future getImage() async {
        // Get image from gallery.
        var image = await ImagePicker.pickImage(source: ImageSource.gallery);
        _uploadImageToDataBase(image);
      }

     

دالة تخزين الصورة (هنا انا استخدم قاعدة البيانات المقدمة من firebase أنت تقوم بتخزينها داخل قاعدة البيانات التي تستخدمها ، ليس شرط أن تكون من firebase )

  Future<void> _uploadImageToDatabase(File image) async {
    try {
      // Make random image name.

      String imageLocation = 'images/image${DateTime.now()}.jpg';

      // Upload image to firebase.
      final StorageReference storageReference =
          FirebaseStorage().ref().child(imageLocation);
      final StorageUploadTask uploadTask = storageReference.putFile(image);
      await uploadTask.onComplete;
      _addPathToDatabase(imageLocation);
    } catch (e) {
      print(e.message);
    }
  }

و هكذا فور اختيار الصورة من قبل المستخدم يتم تحديثها فوراً داخل قاعدة البيانات . ولكن أظن أنك  تحتاج الى استخدام ال StreamBuilder  لكي تحصل على تحديث تلقائي للواجهة الخاصة بك  بنائاً  على الداتا التي تجلبها من قاعدة البيانات . 


انت لا تحتاج الى أكثر من زر  ،  فالصورة يتم تخزينها فور اختيارها ،  و الحقول يتم تخزينهم بعد التعديل عليهم  و الضغط على زر حفظ ،  او تحديث .  

اتمنى ان تكون الفكرة واضحة لديك .  
شكراً  لك  .  

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...