اگر شمام سعی کردین با ضربه زدن به خارج از قسمت فرم صفحه کلید اون رو پنهان کنید و هیچ اتفاقی نیفتاده مشکل از شما نیست . فقط این رو فلاتر به صورت پیش فرض در اختیار شما قرار نداده و خوشبختانه یک راه حل نسبتاً ساده وجود داره واسه این کار .

 

رفتار پیش بینی شده چیست؟


قبل از هر کاری ، بیایید دقیقاً تعریف کنیم که رفتار مورد انتظاری که ما سعی در بازآفرینی او داریم چیه : کاربر باید بتونه روی هر ویجت دیگه ای بجز تکست فیلد یا دکمه ارسال پیام که کلید کرد کیبورد پنهان بشه و به حالت قبل برگرده . 

 

مرحله اول : تشخیص ضربه 

خب اول از همه باید تشخیص بدیم که کاربر روی محیط بیرون تکست فیلد کلیک کرده یا نه و برای تشخیص این کار از GestureDetector استفاده میکنیم که بتونیم با استفاده از onTap که یه تابع ناشناس رو اجرا کنیم .

GestureDetector(
  onTap: () {},
  child: ...
);

سوالی که اینجا پیش میاد اینه که ما GestureDetector خودمون رو کجا قرار بدیم ؟ از اونجایی که ما میخوایم هرکجای برنامه که کلیک شد کیبورد پنهان بشه پس باید اون رو در بالای درخت ویجت های خودمون قرار بدیم و بقیه ویجت هامون رو داخلش تعریف کنیم .

پس اینجا ما MaterialApp خودمون رو درون GestureDetector تعریف میکنیم .

// main.dart
import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () {},
      child: MaterialApp(
        title: 'Flutter Demo',
        theme: ThemeData(
          primarySwatch: Colors.blue,
        ),
        home: MyHomePage(),
      ),
    );
  }
}

 

مرحله دوم : پنهان کردن کیبورد 

برای پنهان کردن کیبودر نیاز داریم که فوکس رو از تکست فیلد حذف کنیم . این کارو با استفاده از FocusNode انجام میدیم . با استفاده از FocusScope.of(context) میایم و FocusNode فعلی رو به دست میاریم .

// main.dart
import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () {
        FocusScopeNode currentFocus = FocusScope.of(context);
      },
      child: MaterialApp(
        title: 'Flutter Demo',
        theme: ThemeData(
          primarySwatch: Colors.blue,
        ),
        home: MyHomePage(),
      ),
    );
  }
}

توی مرحله بعدی میایم چک میکنیم که تکست فیلد ما در حالت فوکس قرار داره و کیبورد ما باز هست . برای این کار یه شرط رو تعریف میکنیم و در صورت درست بودن شرط  با استفاده از ()unfocus  کیبورد رو غیرفعال میکنیم .

// main.dart
import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () {
        FocusScopeNode currentFocus = FocusScope.of(context);

        if (!currentFocus.hasPrimaryFocus) {
          currentFocus.unfocus();
        }
      },
      child: MaterialApp(
        title: 'Flutter Demo',
        theme: ThemeData(
          primarySwatch: Colors.blue,
        ),
        home: MyHomePage(),
      ),
    );
  }
}

 

و در انتها نتیجه کار به صورت زیر خواهد بود : 

 

                                                                                                                  

                                                                                                                      

 

 

تگ ها :

شما برای ارسال نظر باید وارد سایت شوید

دیدگاه های ارزشمند شما