Saya memiliki Kolom widget yang Diperluas seperti ini:
return new Container(
child: new Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
new Expanded(
flex: 1,
child: convertFrom,
),
new Expanded(
flex: 1,
child: convertTo,
),
new Expanded(
flex: 1,
child: description,
),
],
),
);
Ini terlihat seperti ini:
convertFrom
, termasuk TextField. Saat saya mengetuk bidang teks ini, papan ketik Android muncul di layar. Ini mengubah ukuran layar, jadi widget berubah ukuran seperti ini:
Adakah cara agar keyboard "menghamparkan" layar sehingga ukuran Kolom saya tidak berubah? Jika saya tidak menggunakan Expanded
widget dan hardcode a height untuk setiap widget, widget tidak berubah ukurannya, tetapi saya mendapatkan kesalahan bergaris hitam-kuning saat keyboard muncul (karena tidak ada cukup ruang). Ini juga tidak fleksibel untuk semua ukuran layar.
Saya tidak yakin apakah ini khusus Android atau khusus Flutter.
Jawaban:
Di Anda
Scaffold
, setelresizeToAvoidBottomInset
properti kefalse
.Properti "resizeToAvoidBottomPadding" sekarang tidak digunakan lagi .... Di
Scaffold
, setelresizeToAvoidBottomPadding
properti kefalse
.sumber
android:windowSoftInputMode="adjustPan"
? Jika saya menambahkanresizeToAvoidBottomPadding
ke perancah itu akhirnya menutupi BidangTeks.Sebagian besar jawaban lain menyarankan penggunaan
resizeToAvoidBottomPadding=false
. Dalam pengalaman saya, ini memungkinkan keyboard untuk menutupi bidang teks jika mereka berada di bawah tempat keyboard akan muncul.Solusi saya saat ini adalah memaksa kolom saya memiliki tinggi yang sama dengan layar, lalu menempatkannya
SingleChildScrollView
sedemikian rupa sehingga Flutter secara otomatis menggulung layar saya ke atas cukup saat keyboard digunakan.Widget build(BuildContext context) { return Scaffold( body: SingleChildScrollView( physics: NeverScrollableScrollPhysics(), child: ConstrainedBox( constraints: BoxConstraints( minWidth: MediaQuery.of(context).size.width, minHeight: MediaQuery.of(context).size.height, ), child: IntrinsicHeight( child: Column( mainAxisSize: MainAxisSize.max, children: <Widget>[ // CONTENT HERE ], ), ), ), ), ); }
Saya menggunakan
NeverScrollableScrollPhysics
agar pengguna tidak dapat menggulir sendiri.sumber
NeverScrollableScrollPhysics
dan semua terlihat baik-baik saja kecuali pengguna dapat mencoba untuk menggesek ke atas dan ke bawah dan mereka dapat melihat cahaya overscroll. Ketika saya menggunakannya,NeverScrollableScrollPhysics
itu memberi saya perilaku yang sama sepertiresizeToAvoidBottomInset
Setel
resizeToAvoidBottomInset
kefalse
alih-alihresizeToAvoidBottomPadding
yang tidak digunakan lagi.return Scaffold( resizeToAvoidBottomInset : false, body: YourWidgets(), );
sumber
Metode 1: Hapus
android:windowSoftInputMode="adjustResize"
dari file AndroidManifest.xml (Jika tidak, kode flutter akan diganti) dan tambahkanresizeToAvoidBottomPadding: false
Scaffold seperti di bawah ini:Scaffold( resizeToAvoidBottomPadding: false, appBar: AppBar() )
Metode 2 (Tidak Direkomendasikan): Cukup Tambahkan
android:windowSoftInputMode="stateVisible"
di Android AndroidManifest.xml dalam aktivitas itu hanya akan bekerja untuk Android dan Bukan untuk iOS seperti.<activity ... android:windowSoftInputMode="stateVisible">
Catatan: Jangan setel ke
android:windowSoftInputMode="adjustResize"
sumber
Menurut saya, jika kita menerapkan solusi @ Aman, itu akan membuat aplikasi kita berperilaku jelek seperti ketika keyboard muncul, itu tidak akan menyesuaikan viewport layar kita sesuai ketinggian yang tersedia dan itu akan membuat bidang lain bersembunyi di balik keyboard. Jadi saya akan menyarankan penggunaan
SingleChildScrollView
sebagai gantinya.Bungkus kode Anda dengan
SingleChildScrollView
seperti yang diberikan di bawah ini,return new Container( child: SingleChildScrollView( child: new Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: <Widget>[ new Expanded( flex: 1, child: convertFrom, ), new Expanded( flex: 1, child: convertTo, ), new Expanded( flex: 1, child: description, ), ], ), ), );
sumber
Tergantung pada kasus penggunaan Anda juga bisa mempertimbangkan menggunakan ListView . Itu akan memastikan bahwa konten bergulir ketika tidak ada cukup ruang. Sebagai contoh, Anda dapat melihat demo textfield di aplikasi galeri
sumber
Pendekatan saya adalah dengan menggunakan
SingleChildScrollView
denganClampingScrollPhysics
fisika.sumber
Bagi saya mengubah properti item di bawah ini dari true menjadi false
<item name="android:windowFullscreen">false</item>
dalam file
telah membuat Flutter menyeret semua konten halaman ke atas pada fokus masukan
sumber
Saran saya adalah
resizeToAvoidBottomInset: false
tetap menggunakannya untuk mencegah widget berubah ukuran jika keyboard tiba-tiba muncul di layar. Misalnya, jika pengguna menggunakan kepala obrolan Facebook saat berada di aplikasi Anda.Untuk mencegah keyboard dari overlay widget, pada layar di mana Anda membutuhkannya, saya menyarankan pendekatan berikut, di mana ketinggian
SingleChildScrollView
dikurangi menjadi ketinggian ruang yang tersedia. Dalam hal ini,SingleChildScrollView
gulir juga ke widget yang difokuskan.final double screenHeight = MediaQuery.of(context).size.height; final double keyboardHeight = MediaQuery.of(context).viewInsets.bottom; return Scaffold( resizeToAvoidBottomInset: false, body: SizedBox( height: screenHeight - keyboardHeight, child: SingleChildScrollView( child: Column( children: [ const SizedBox(height: 200), for (var i = 0; i < 10; i++) const TextField() ], ), ), ), );
sumber