Как сделать кнопку ящика UnClickable во Flutter

Когда мое приложение запускается, некоторые данные загружаются в фоновом режиме. Я не хочу, чтобы пользователи в это время нажимали на значок Drawer, поэтому я сделал что-то вроде этого.

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      title: Text('Title'),
    ),
    drawer: _isLoading ? null : HomeDrawer(),
    body: _isLoading ? CircularProgressIndicator() : _body(),
  );
}

В этом случае, когда приложение загружается, кнопка ящика не видна

Как сделать кнопку ящика UnClickable во Flutter

После загрузки кнопка возвращается.

Как сделать кнопку ящика UnClickable во Flutter

Я хочу Кнопка ящика должна быть видна во время загрузки, но на нее нельзя нажимать.

0
0
522
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я использовал пользовательскую кнопку ящика, где я назначаю/удаляю ее событие 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.

Конечно, мне также пришло в голову добавить пользовательскую кнопку, но есть ли какое-либо свойство или какой-либо способ, с помощью которого мы можем сделать кнопку Drawer недоступной для кликов?

Mangaldeep Pannu 07.04.2019 15:54

Не то, чтобы я мог думать. Попробуйте использовать AbsorbPainter.

Anis Alibegić 07.04.2019 16:02
Ответ принят как подходящий

Вы можете попробовать это.

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(),
  );
}

Спасибо, что ответили мне снова. Очень жалею, что еще не пробовал. Я дам тебе день или два. Мои экзамены идут в эти дни. Надеюсь ты понимаешь.

Mangaldeep Pannu 08.04.2019 16:11

Нет проблем, не торопитесь и дайте мне знать. Хорошего дня :)

CopsOnRoad 08.04.2019 16:13

Спасибо за помощь еще раз.

Mangaldeep Pannu 09.04.2019 17:34

Другие вопросы по теме