Когда мое приложение запускается, некоторые данные загружаются в фоновом режиме. Я не хочу, чтобы пользователи в это время нажимали на значок Drawer
, поэтому я сделал что-то вроде этого.
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Title'),
),
drawer: _isLoading ? null : HomeDrawer(),
body: _isLoading ? CircularProgressIndicator() : _body(),
);
}
В этом случае, когда приложение загружается, кнопка ящика не видна
После загрузки кнопка возвращается.
Я хочу Кнопка ящика должна быть видна во время загрузки, но на нее нельзя нажимать.
Я использовал пользовательскую кнопку ящика, где я назначаю/удаляю ее событие onPressed на основе переменной _isLoaded
. Через 3 секунды после загрузки страницы я устанавливаю для переменной _isLoaded
значение true
, которое повторно отображает страницу, включает кнопку ящика и скрывает загрузчик.
class _MyHomePageState extends State<MyHomePage> {
bool _isLoaded = false;
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
@override
void initState() {
super.initState();
this._apiCallSample();
}
void _apiCallSample() async {
await Future.delayed(Duration(seconds: 3)).then((_) {
setState(() {
this._isLoaded = true;
});
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
leading: IconButton(
icon: Icon(Icons.menu),
onPressed: !this._isLoaded ? null : () => this._scaffoldKey.currentState.openDrawer(),
),
title: Text("Drawer"),
),
body: Center(
child: Builder(
builder: (BuildContext context) {
if (!this._isLoaded) {
return CircularProgressIndicator();
}
return Text("Loaded!");
},
),
),
drawer: Drawer(
child: Center(
child: Text("Drawer"),
),
),
key: this._scaffoldKey,
);
}
}
Если вы хотите, чтобы пользователь не нажимал в любом месте на странице, используйте Абсорбуинтер.
When absorbing is true, this widget prevents its subtree from receiving pointer events by terminating hit testing at itself.
Не то, чтобы я мог думать. Попробуйте использовать AbsorbPainter.
Вы можете попробовать это.
bool _isLoading = false;
GlobalKey<ScaffoldState> _key = GlobalKey();
@override
Widget build(BuildContext context) {
return Scaffold(
key: _key,
appBar: AppBar(
title: Text("App"),
leading: IconButton(
icon: Icon(Icons.menu),
onPressed: _isLoading ? null : () => _key.currentState.openDrawer(),
),
),
drawer: YourDrawer(),
);
}
Спасибо, что ответили мне снова. Очень жалею, что еще не пробовал. Я дам тебе день или два. Мои экзамены идут в эти дни. Надеюсь ты понимаешь.
Нет проблем, не торопитесь и дайте мне знать. Хорошего дня :)
Спасибо за помощь еще раз.
Конечно, мне также пришло в голову добавить пользовательскую кнопку, но есть ли какое-либо свойство или какой-либо способ, с помощью которого мы можем сделать кнопку Drawer недоступной для кликов?