Любопытно, почему моя функция onPressed не работает в режиме отладки flutter

#flutter #flutter-layout

#флаттер #flutter-layout

Вопрос:

Я пытаюсь реализовать простой нижний лист в flutter в методе onPressed

вот мой код

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

class LoginScreen extends StatelessWidget {
  void _onButtonPressed(BuildContext context) {
    showModalBottomSheet(
        context: context,
        builder: (context) => new Column(
              children: [
                new Container(
                  child: Text('Hello'),
                )
              ],
            ));
  }

  @override
  Widget build(BuildContext context) => new Scaffold(
        body: new RaisedButton(
          onPressed: () => _onButtonPressed(context),
          child: Text('Hello'),
        ),
      );
}

 

Поэтому всякий раз, когда я устанавливаю свой flutterMode в режиме отладки файла запуска, он показывает мне исключение, когда я нажимаю свою кнопку

 'package:flutter/src/widgets/navigator.dart': Failed assertion: line 3524 pos 12: '!_debugLocked': is not true.

 

Но когда я создаю свое приложение в режиме профиля или выпуска, нижний лист работает как по волшебству.
Есть ли для этого какая — то конкретная причина ?

Потому что у меня есть другая страница, которая также реализует нижний лист, но она работает в любом из режимов.

только что создал это приложение на Android studio

 ════════ Exception caught by gesture ═══════════════════════════════════════════════════════════════
The following assertion was thrown while handling a gesture:
'package:flutter/src/widgets/navigator.dart': Failed assertion: line 3524 pos 12: '!_debugLocked': is not true.


Either the assertion indicates an error in the framework itself, or we should provide substantially more information in this error message to help you determine and fix the underlying cause.
In either case, please report this assertion by filing a bug on GitHub:
  https://github.com/flutter/flutter/issues/new?template=BUG.md

When the exception was thrown, this was the stack: 
#2      NavigatorState.push (package:flutter/src/widgets/navigator.dart:3524:12)
#3      showModalBottomSheet (package:flutter/src/material/bottom_sheet.dart:667:65)
#4      _LoginScreen._onButtonPressed (package:mahayoga_admin/loginScreen.dart:10:5)
#5      _LoginScreen.build.<anonymous closure> (package:mahayoga_admin/loginScreen.dart:29:53)
#6      _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:993:19)
...
Handler: "onTap"
Recognizer: TapGestureRecognizer#095ab
  debugOwner: GestureDetector
  state: possible
  won arena
  finalPosition: Offset(18.8, 44.1)
  finalLocalPosition: Offset(44.0, 18.0)
  button: 1
  sent tap down
════════════════════════════════════════════════════════════════════════════════════════════════════

 

итак, я изменил свой код примерно так

 import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:mahayoga_admin/bottomSheetDrawer.dart';

class LoginScreen extends StatefulWidget {
  State<StatefulWidget> createState() => _LoginScreen();
}

class _LoginScreen extends State<LoginScreen> {
  void _onButtonPressed(BuildContext context) {
    showModalBottomSheet(
        context: context,
        builder: (context) => SingleChildScrollView(
          child: Container(
            padding: EdgeInsets.only(
              bottom: MediaQuery.of(context).viewInsets.bottom,
            ),
            child: new Container(
              child: Text("Hello world"),
            ),
          ),
        ));
  }

  @override
  Widget build(BuildContext context) => new Scaffold(
      body: new Container(
          height: MediaQuery.of(context).size.height,
          child: SingleChildScrollView(
            child: new Container(
              child: Column(
                children: [
                  new RaisedButton(onPressed: () => _onButtonPressed(context))
                ],
              ),
            ),
          )));
}

 

Комментарии:

1. Попробуйте использовать StatefullWidget вместо StatelessWidget

2. нет такой же ошибки и с StatefulWidget

Ответ №1:

Чтобы решить эту проблему, просто заверните его в контейнер и установите высоту на максимальную высоту экрана следующим образом:

 @override
  Widget build(BuildContext context) {
    return Container(
      height: MediaQuery.of(context).size.height,
      child: SingleChildScrollView(
        child: ... //You can then have a column warped within a container(height specified)....after that under column use the raised button
      ),
    ),
  }
 

Комментарии:

1. Использовали ли вы именно то, что я дал с помощью виджета statefull?

2. Попробуйте добавить дочерний элемент к поднятой кнопке, например текст или значок, и вместо => попробуйте обернуть с помощью {} и да, пожалуйста, обратитесь к документации модального листа.

Ответ №2:

Хорошо, извините, ребята, за то, что беспокоили всех, но насколько я отлаживал вручную, так я перемещал свое приложение по экрану. Что происходило на самом деле, я переходил к экрану выше, упомянутому в моем заявлении о проблеме, проверяя, аутентифицирован ли пользователь или нет в функции OnInit предыдущего состояния. В предыдущем состоянии, как я уже упоминал, я реализовал нижний лист. S реализация не удалась, и внезапно я перескочил на другой экран, и именно поэтому на приведенном выше экране я не смог получить свой нижний лист. Итак, все, что мне нужно сделать, это правильно изменить мои навигации.