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

تغير موقع موشر الماوس في textformfield في flutter

Flutter Dev

السؤال

انا عامل حقل من نوع textformfield   

TextFormField(

                             validator: (value) {
                               if (value.isEmpty) {
                                 return 'cannot be empty'.tr();
                               }
                               return null;
                             },
                          

                            
                             keyboardType: TextInputType.number,
     
                             decoration: InputDecoration(
                                 border: OutlineInputBorder(),
                                 labelText: 'Phone_number'.tr(),
                                 filled: true,
                                 hintText: ''),

                             controller: Controllerphone,
                           ),

طبعا المستخدم من المفترض ان يكون قادر على ادخال رقم هاتفه في هذا الحقل / المشكلة انني قمت بربط هذا الحقل مع قاعدة البيانات من خلال 

controller: Controllerphone,

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

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

 ولو حاول الان استعمال الأرقام والقيام بإضافة رقم لن يستطيع الكتابة الا في حالة قام بضغط مره أخرى وتغير موقع مؤشر الماوس لبداية النص او موقع مختلف في  حقل textformfield  بمعنى وكانه سوف يكمل البيانات الموجودة / قمت بتأكد بالنسبة إلى كتابة النصوص هيا تعمل ولا توجد مشكلة في موقع مؤشر الماوس لا اعلم لماذا تحدث فقط مع الأرقام.

أيضا لو قمت بكتابة  نص في البداية ثم حذفه ومحاولة كتابة رقم بعد ذلك الامر يعمل بشكل طبيعي والمشكلة تختفي مع ان موقع المؤشر لا يزال في بداية الكلام وقبل النص الموجود.

 

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

 controller: Controllerphone,

هل يوجد تفسير لهذا المشكلة وحل لها؟ ياليت اذا احد لديه فكره عن الامر او حل لتغير موقع المؤشر في البداية

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 2

يبدو أنها عبارة عن خطأ أو سهوة برمجية في المكتبة Big بسيطة.

سوف نحاول نقل مؤشر الكتابة عن طريق الكود التالي:

  • بعد إسناد النص في شيفرة المتحكم
  • نقوم بنقل مؤشر الكتابة لنهاية النص
  • fromPosition تحدد بداية النص مكان الكتابة
  • تم تحديد طول النص من خلال controller.text.length يمكنك وضعه بأي قيمة مثلاً من طول السلسة التي تستخدمها
controller.text = '...'; النص

controller.selection = TextSelection.fromPosition(TextPosition(offset: controller.text.length));

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 2
بتاريخ 8 دقائق مضت قال مروان مروان3:

لو تكرمت توضح كيفية استعماله في الكود الذي قمت بمشاركته في اول المشاركة انا / اعتذر ولكن حقيقه لم افهم طريقة عمل ذلك

هل يمكنك إرفاق شيفرة Controllerphone? أي بعد تعريفه سنتمكن من تطبيق الدوال عليه، تأكد من تطبيق الشيفرة السابقة بعد تحميل البيانات 

class _MyCustomFormState extends State<MyCustomForm> {

  final myController = TextEditingController();

  @override
  void initState() {
    super.initState();
  // تهئية
  myController.addListener(_myListener);
  }

  @override
  void dispose() {
    // تنظيف
    myController.dispose();
    super.dispose();
  }
  void _myListener() {
  controller.selection = TextSelection.fromPosition(TextPosition(offset: controller.text.length));
  }
}

كما يمكن نقلع عند النقر عليه onTap

TextField(
    controller: _controller,
    onTap: () => _controller.selection = TextSelection(baseOffset: 0, extentOffset: _controller.value.text.length),
)

أو

TextField(
    controller: _controller,
    onTap: () => _controller.selection = TextSelection.fromPosition(TextPosition(offset: controller.text.length));
)

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 1
بتاريخ 2 ساعات قال مروان مروان3:

نعم هذا الصفحة كامله / حاولت تطبيق الامر في onTap ولم ينجح الامر

عند مراجعة الشيفرة تبين أنك تقوم ببناء اثنين من Controllerphone وهما غير مرتبطين ببعضهم لم أفهم سبب ذلك.

مرة ضمن الصنف و مرة ضمن Build.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 1
بتاريخ منذ ساعة مضت قال مروان مروان3:

اهلا اخي الكريم استعمل واحده لتحرير البيانات اما الثانية لتعبئتها بالبيانات وعرضها

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

 

حاول استخدام غير اسم لكل منها.

وتأكد من ربط onTap مع المتحكم ما بعد تحميل البيانات

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 1 ساعة قال Wael Aljamal:

يبدو أنها عبارة عن خطأ أو سهوة برمجية في المكتبة Big بسيطة.

سوف نحاول نقل مؤشر الكتابة عن طريق الكود التالي:

  • بعد إسناد النص في شيفرة المتحكم
  • نقوم بنقل مؤشر الكتابة لنهاية النص
  • fromPosition تحدد بداية النص مكان الكتابة
  • تم تحديد طول النص من خلال controller.text.length يمكنك وضعه بأي قيمة مثلاً من طول السلسة التي تستخدمها

controller.text = '...'; النص

controller.selection = TextSelection.fromPosition(TextPosition(offset: controller.text.length));

 

مرحبا اخي الكريم

شاكر لك ردك 

لو تكرمت توضح كيفية استعماله في الكود الذي قمت بمشاركته في اول المشاركة انا / اعتذر ولكن حقيقه لم افهم طريقة عمل ذلك

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 14 ساعات قال Wael Aljamal:

هل يمكنك إرفاق شيفرة Controllerphone? أي بعد تعريفه سنتمكن من تطبيق الدوال عليه، تأكد من تطبيق الشيفرة السابقة بعد تحميل البيانات 


class _MyCustomFormState extends State<MyCustomForm> {

  final myController = TextEditingController();

  @override
  void initState() {
    super.initState();
  // تهئية
  myController.addListener(_myListener);
  }

  @override
  void dispose() {
    // تنظيف
    myController.dispose();
    super.dispose();
  }
  void _myListener() {
  controller.selection = TextSelection.fromPosition(TextPosition(offset: controller.text.length));
  }
}

كما يمكن نقلع عند النقر عليه onTap


TextField(
    controller: _controller,
    onTap: () => _controller.selection = TextSelection(baseOffset: 0, extentOffset: _controller.value.text.length),
)

أو

TextField(
    controller: _controller,
    onTap: () => _controller.selection = TextSelection.fromPosition(TextPosition(offset: controller.text.length));
)

 

أهلا اخي الكريم

نعم هذا الصفحة كامله / حاولت تطبيق الامر في onTap ولم ينجح الامر




void main() {
  runApp(
    EasyLocalization(
      saveLocale: true,
      supportedLocales: [Locale('en', 'US'), Locale('ar', 'SA')],
      path: 'assets/translations',
      fallbackLocale: Locale('en', 'US'),
      child: UpdateProfile(),
    ),
  );
}

class UpdateProfile extends StatefulWidget {
  @override
  _UpdateState createState() => new _UpdateState();
}

class _UpdateState extends State<UpdateProfile> {
  
  @override
  void initState() {
    super.initState();
    _fetchData();
  }
  
  var _phone = "";
  var Controllerphone = new TextEditingController();
  void _editData() async {
    var url = 'https://********************fyProfile.php';

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

      "phone": Controllerphone.text,
    
    });
    if (response.statusCode == 200) {
      Navigator.of(context, rootNavigator: true).pop();
    
    } else {
      
    }
  }
  
List data=[];
  _fetchData() async {
    final url =
        "https://*********************Profile.php";
    final response = await http.get(Uri.parse(url));
    if (response.statusCode == 200) {
      final map = json.decode(response.body);
      final videosMap = map["result"];
      setState(() {
        this.data = videosMap;
        _phone = data[0]['phone'];

      });
    }
  }

  final TextEditingController controller = TextEditingController();
  @override
  Widget build(BuildContext context) {
    
    Controllerphone = new TextEditingController(text: _phone);
    
    return MaterialApp(
        localizationsDelegates: context.localizationDelegates,
        supportedLocales: context.supportedLocales,
        locale: context.locale,
      home: Scaffold(

      appBar: AppBar(
        title: Text("Profile",
            style: TextStyle(
                 color: CustomColors.firebaseNavy))
            .tr(),
        backgroundColor: CustomColors.firebaseGrey,
        elevation: 1.5,
        centerTitle: true,
        leading: BackButton(
          color: CustomColors.firebaseNavy,
          onPressed: () {
            Navigator.pop(context);
          },
        ),
     
      ),
      body:  Form(
 
    child: Center(
        child: data == null
            ? new CircularProgressIndicator(
          valueColor: new AlwaysStoppedAnimation<Color>(Colors.black),
        )
            : new ListView(
          children: <Widget>[
          
            Card(
                child: Column(children: <Widget>[
                  
             Row(
               children: [

                 Expanded(
                   child: Container(
                     margin: const EdgeInsets.all(4),
                     child: Row(
                       children: [
                         Expanded(
                           child:
                           TextFormField(
                             validator: (value) {
                               if (value.isEmpty) {
                                 return 'cannot be empty'.tr();
                               }
                               return null;
                             },
                             keyboardType: TextInputType.number,
                            
                             decoration: InputDecoration(
                                 border: OutlineInputBorder(),
                                 labelText: 'Phone'.tr(),
                                 filled: true,
                                 hintText: ''),

                controller: Controllerphone,
                               onTap: () => Controllerphone.selection = TextSelection.fromPosition(TextPosition(offset: Controllerphone.text.length)),
    ),

                         ),
                       ],
                     ),
                   ),
                 ),
               ],
             ),
                  
                ])),
          ],
        ),
      ),
      ),
      )

    );
  }
}

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 2 ساعات قال Wael Aljamal:

عند مراجعة الشيفرة تبين أنك تقوم ببناء اثنين من Controllerphone وهما غير مرتبطين ببعضهم لم أفهم سبب ذلك.

مرة ضمن الصنف و مرة ضمن Build.

اهلا اخي الكريم استعمل واحده لتحرير البيانات اما الثانية لتعبئتها بالبيانات وعرضها

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

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ On 4/12/2022 at 19:04 قال Wael Aljamal:

حاول استخدام غير اسم لكل منها.

وتأكد من ربط onTap مع المتحكم ما بعد تحميل البيانات

مرحبا اخي الكريم

جمعه مباركه عليكم

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

 

سوف اعود بعد الانتهاء مع النتائج التي وصلت لها

رابط هذا التعليق
شارك على الشبكات الإجتماعية

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...