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

السؤال

نشر

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

قمت بعمل صفحة تحتوي على Alert Dialog وفي داخله قمت بوضع list view  لعرض مجموعة من البيانات التي احصل على من السيرفر ثم قمت بوضع Text Field في نفس Alert Dialog للبحث في القائمة التي احصل عليها.

الان مشكلتي  لو قام المستخدم بكتابة محتوى البحث المطلوب في خانة Text Field لن يتم تصفية البيانات بمعنى الكود لن يعمل ولكن لو قمت بأغلاق Alert Dialog وإعادة فتحه سوف اجد ان البيانات تم تصفيتها حسب محتوى البحث الذي قمت بإدخالها سابقا  في Text Field .

بمعنى الكود لن يقوم بتصفية البيانات الا في حالة قمت بأغلاق Alert Dialog بعد ادخال البيانات وإعادة فتحه من جديد حتى احصل على القائمة التي تم تصفيتها وظهور النتائج 

الكود المستعمل كامل هو كالتالي:



class _testwoState extends State<tottto> {

  bool showicon = false;

  var apiURL;


  @override
  void initState() {
  
   
      getdata();
   

    super.initState();
  }

  Future getdata() async {
    setState(() {
      showicon = true;
    });
    apiURL = 'https://****************.php';
    var response = await http.post(Uri.parse(apiURL));

    var responsebody = jsonDecode(response.body);

    if (responsebody.length > 0) {
      return responsebody;
    } else {
      showicon = false;
    }
  }

  TextEditingController editingController = TextEditingController();
  Widget appBarTitle = Text('').tr();
  Icon actionIcon = new Icon(
    Icons.search,
    color: CustomColors.firebaseNavy,
  );

  String searchString = "";
  TextEditingController searchController = TextEditingController();
  void alertDialog(BuildContext context) {
    var alert = AlertDialog(
      content: SingleChildScrollView(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [

            TextField(
              inputFormatters: <TextInputFormatter>[
                FilteringTextInputFormatter.deny(RegExp("[٠-٩]")),
              ],
              onChanged: (value) {
                setState(() {
                  searchString = value;
                });
              },
              controller: searchController,
              style: new TextStyle(
                color: Colors.black,
              ),
              decoration: new InputDecoration(
                  labelText: 'Name'.tr(),
                  prefixIcon:
                      new Icon(Icons.search),
                  //  hintText: "Send_To".tr(),
                  hintStyle: new TextStyle(color: Colors.black)),
            ),
            FutureBuilder(
              future: getdata(),
              builder: (context, AsyncSnapshot snapshot) {
                if (snapshot.hasData) {
                  return Container(
                    width: 450,
                    height: 500,
                    child: ListView.separated(
                        separatorBuilder: (BuildContext context, int index) =>
                            Divider(height: 1, thickness: 1),
                        scrollDirection: Axis.vertical,
                        shrinkWrap: true,
                        physics: ScrollPhysics(),
                        itemCount: snapshot.data.length,
                        itemBuilder: (context, index) {
                          return "${snapshot.data[index]['EnLocation']}".contains(searchString)
                              ? Column(
                                  crossAxisAlignment:
                                      CrossAxisAlignment.stretch,
                                  children: <Widget>[
                                      Column(
                                        children: <Widget>[
                                          Column(
                                            children: <Widget>[
                                             ListTile(
                                                      title: Text(
                                                          "${snapshot.data[index]['EnLocation']}",
                                                          style: TextStyle(
                                                            fontSize: 17,)),
                          
                                            ],
                                          ),

                                          // Divider(),
                                        ],
                                      ),

                                      //   Divider(),
                                    ])
                              : Container();
                        }),
                  );
                } else if (snapshot.hasError) {
                  return Center(
                      child: Image.asset(
                    'assets/no_dataa.png',
                    fit: BoxFit.contain,
                    width: 180,
                    height: 180,
                  ));
                }

                // By default, show a loading spinner.
                return showicon
                    ? SizedBox(
                        height: MediaQuery.of(context).size.height / 1.3,
                        child: Center(
                          child: CircularProgressIndicator(
                            valueColor:
                                new AlwaysStoppedAnimation<Color>(Colors.black),
                          ),
                        ),
                      )
                    : Center(
                        child: SizedBox(
                        height: MediaQuery.of(context).size.height / 1.3,
                        child: Image.asset(
                          'assets/no_dataa.png',
                          fit: BoxFit.contain,
                          width: 180,
                          height: 180,
                        ),
                      ));
              },
            ),
          ],
        ),
      ),
      actions: <Widget>[
        FlatButton(
          onPressed: () {
            //   Navigator.of(context).pop();
            Navigator.of(context, rootNavigator: true).pop('dialog');
          },
          child: Text('Close'),
        )
      ],
    );
    showDialog(context: context, builder: (BuildContext context) => alert);
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Column(children: [

          Padding(
            padding: const EdgeInsets.all(8.0),
            child: Card(
              child: ListTile(
                title: Text('Wake Up!'),
                trailing: Icon(Icons.keyboard_arrow_down),
                onTap: () => alertDialog(context),
              ),
            ),
          ),


        ]),
      ),
    );
  }
}

 

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

لو فيه احد يعرف سبب المشكلة يساعدنا ولكم جزيل الشكر

Recommended Posts

  • 1
نشر

سبب المشكلة هو عدم عمل rebuild للواجهة بعد تعديل قيمة العناصر المفلترة (ألتي هي نتيجة إدخال المستخدم).

الحل:

  • تعريف مصفوفة/قائمة بجميع القيم all_Data
  • تعريف مصفوفة/قائمة سوف تحوي النتائج results
  • عند إدخال المستخدم لأي قيمة 
    • نبحث ضمن مصفوفة all_Data ونعمل فلترة للنتائج ونخزنهم في results
    • نعمل set State لتحديث العرض

ضمن صف الحالة نعرف المصفوفتين، 

final List<Map<String, dynamic>> all_Data = [
  {"id": 1, "name": "Andy", "age": 29},
  {"id": 2, "name": "Aragon", "age": 40},
  ....
];

List<Map<String, dynamic>> results = [];
@override
initState() {
  results = all_Data;            //   ممكن وضع جميع القيم بشكل ابتدائي
  super.initState();
}

ثم عمل فلترة حسب حقل معين ضمن القائمة

  // دالة البحث تستقبل كلمة للبحث عنها
void _runFilter(String enteredKeyword) {
    
    List<Map<String, dynamic>> filtered_results = [];     // مصفوفة مؤقتة للنتيجة
  // بحث فارغ
  if (enteredKeyword.isEmpty) {
      filtered_results = all_Data;
    } else {
      // عمل فلترة و بحث
      filtered_results = all_Data
          .where((user) =>
              user["name"].toLowerCase().contains(enteredKeyword.toLowerCase()))
          .toList();
    }

    // تحديث الواجهة
    setState(() {
      results = filtered_results;
    });
  }

يمكن استدعاء دالة البحث و الفلترة في حدث onchange

TextField(
  onChanged: (value) => _runFilter(value),
    ),

 

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...