Adakah cara untuk menonaktifkan tombol kembali Android saat berada di halaman tertentu?
class WakeUpApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: "Time To Wake Up ?",
home: new WakeUpHome(),
routes: <String, WidgetBuilder>{
'/pageOne': (BuildContext context) => new pageOne(),
'/pageTwo': (BuildContext context) => new pageTwo(),
},
);
}
}
Di halamanSatu saya memiliki tombol untuk pergi ke halamanDua:
new FloatingActionButton(
onPressed: () {
Navigator.of(context).pushNamed('/pageTwo');
},
)
Masalah saya adalah jika saya menekan panah Kembali di bagian bawah layar android, saya kembali ke pageOne. Saya ingin tombol ini tidak muncul sama sekali. Idealnya, saya tidak ingin ada jalan keluar yang mungkin dari layar ini kecuali pengguna terus menekan jarinya di layar selama 5 detik. (Saya mencoba menulis Aplikasi untuk balita, dan hanya ingin orang tua yang dapat menavigasi keluar dari layar tertentu).
onWillPop
properti Formulir . Ini memiliki akses ke status formulir dan pertama-tama dapat memeriksa untuk melihat apakah ada status yang mungkin tidak ingin hilang dari pengguna.onWillPop: () async { onBack(); // "DO YOUR FUNCTION IS HERE WHEN POP" return false; }
Seperti yang ditunjukkan Rémi Rousselet,
WillPopScope
biasanya cara yang harus ditempuh. Namun, jika Anda mengembangkan widget stateful yang harus bereaksi langsung ke tombol kembali, Anda dapat menggunakan ini:https://pub.dartlang.org/packages/back_button_interceptor
Catatan: Saya adalah pembuat paket ini.
sumber
Meskipun jawaban Remi benar, biasanya Anda tidak ingin memblokir tombol kembali tetapi ingin pengguna mengonfirmasi jalan keluar.
Anda dapat melakukannya dengan cara yang sama dengan mendapatkan jawaban dari dialog konfirmasi, karena
onWillPop
ini adalah masa depan.@override Widget build(BuildContext context) { return WillPopScope( child: Scaffold(...), onWillPop: () => showDialog<bool>( context: context, builder: (c) => AlertDialog( title: Text('Warning'), content: Text('Do you really want to exit'), actions: [ FlatButton( child: Text('Yes'), onPressed: () => Navigator.pop(c, true), ), FlatButton( child: Text('No'), onPressed: () => Navigator.pop(c, false), ), ], ), ), ); }
sumber
Saya memposting ini di sini jika ada orang di luar sana yang menemukan ini dan berharap mereka akan menemukan contoh sederhana https://gist.github.com/b-cancel/0ca372017a25f0c120b14dfca3591aa5
import 'package:flutter/material.dart'; import 'dart:async'; void main() => runApp(new BackButtonOverrideDemoWidget()); class BackButtonOverrideDemoWidget extends StatefulWidget{ @override _BackButtonOverrideDemoWidgetState createState() => new _BackButtonOverrideDemoWidgetState(); } class _BackButtonOverrideDemoWidgetState extends State<BackButtonOverrideDemoWidget> with WidgetsBindingObserver{ //-------------------------Test Variable bool isBackButtonActivated = false; //-------------------------Required For WidgetsBindingObserver @override void initState() { super.initState(); WidgetsBinding.instance.addObserver(this); } @override void dispose() { WidgetsBinding.instance.removeObserver(this); super.dispose(); } //-------------------------Function That Triggers when you hit the back key @override didPopRoute(){ bool override; if(isBackButtonActivated) override = false; else override = true; return new Future<bool>.value(override); } //-------------------------Build Method @override Widget build(BuildContext context) { return new Directionality( textDirection: TextDirection.ltr, child: new Container( color: (isBackButtonActivated) ? Colors.green : Colors.red, child: new Center( child: new FlatButton( color: Colors.white, onPressed: () { isBackButtonActivated = !isBackButtonActivated; setState(() {}); }, child: (isBackButtonActivated) ? new Text("DeActive the Back Button") : new Text("Activate the Back Button"), ) ) ), ); } }
sumber
Anda dapat menggunakan
Future.value(bool)
untuk menangani tombol kembali.bool _allow = true; @override Widget build(BuildContext context) { return WillPopScope( child: Scaffold(appBar: AppBar(title: Text("Back"))), onWillPop: () { return Future.value(_allow); // if true allow back else block it }, ); }
sumber
onWillPop: () async => _allow
.Future.value()
panggilan.Saya menggunakan widget mixin dan WillPopScope hanya tidak bisa menyelesaikan pekerjaan untuk saya. Ini adalah pendekatan terbaik yang saya temukan, jauh lebih baik daripada WillPopScope menurut saya.
final bool canPop = ModalRoute.of(context)?.canPop ?? false;
Digunakan seperti ini di dalam appbar:
leading: ModalRoute.of(context)?.canPop ?? false ? IconButton( onPressed: () { Navigator.pop(context); }, icon: (Platform.isAndroid) ? const Icon(Icons.arrow_back) : const Icon(Icons.arrow_back_ios), ) : Container(),
sumber
Jawabannya mungkin Anda tahu itu menggunakan WillPopScope , tetapi sayangnya di iOS Anda tidak dapat menggeser ke belakang halaman sebelumnya, jadi mari sesuaikan MaterialPageRoute Anda:
class CustomMaterialPageRoute<T> extends MaterialPageRoute<T> { @protected bool get hasScopedWillPopCallback { return false; } CustomMaterialPageRoute({ @required WidgetBuilder builder, RouteSettings settings, bool maintainState = true, bool fullscreenDialog = false, }) : super( builder: builder, settings: settings, maintainState: maintainState, fullscreenDialog: fullscreenDialog, ); }
Sekarang Anda dapat menggunakan WillPopScope dan geser ke belakang akan berfungsi di iOS. Jawaban detailnya ada di sini: https://github.com/flutter/flutter/issues/14203#issuecomment-540663717
sumber
Cukup tambahkan wadah di depan Appbar yang menyembunyikan tombol kembali.
AppBar( title: new Text('Page Title'), leading: new Container(), ),
sumber