Трепещущий баннер не подходит

#flutter #banner

#трепещущий #баннер

Вопрос:

У меня проблема с виджетом баннера. Чтобы продемонстрировать это, я создал некоторый демонстрационный код. Что я хочу, так это иметь баннер в правом верхнем углу контейнера, но это некрасиво, так как он переполняет свой дочерний элемент (см. Прикрепленное изображение).

введите описание изображения здесь

Вот мой код:

 class TestPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Banner(
          message: "hello",
          location: BannerLocation.topEnd,
          color: Colors.red,
          child: Container(
            margin: const EdgeInsets.all(10.0),
            color: Colors.yellow,
            height: 100,
            child: Center(child: Text("Hello, banner!"),),
          ),
        ),
      ),
    );
  }
}
  

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

Как можно избежать этого «переполнения баннера»?

Большое спасибо!

Ответ №1:

Просто добавляю clipRect в код Op

 return Scaffold(
      body: Center(
        child: ClipRect(
          child: Banner(
            message: "hello",
            location: BannerLocation.topEnd,
            color: Colors.red,
            child: Container(
              margin: const EdgeInsets.all(10.0),
              color: Colors.yellow,
              height: 100,
              child: Center(child: Text("Hello, banner!"),),
            ),
          ),
        ),
      ),
    );
  

введите описание изображения здесь

Инвертирование контейнера и баннера

 return Scaffold(
      body: Center(
        child: Container(
          margin: const EdgeInsets.all(10.0),

          height: 100,
          color: Colors.yellow,
          child: Banner(
            message: "hello",
            location: BannerLocation.topEnd,
            color: Colors.red,
            child: Container(


              child: Center(child: Text("Hello, banner!"),),
            ),
          ),
        ),
      ),
  

введите описание изображения здесь

Добавление clipRect в инвертирующий контейнер и баннер

 return Scaffold(
      body: Center(
        child: ClipRect(
        child: Container(
          margin: const EdgeInsets.all(10.0),

          height: 100,
          color: Colors.yellow,

            child: Banner(
              message: "hello",
              location: BannerLocation.topEnd,
              color: Colors.red,
              child: Container(


                child: Center(child: Text("Hello, banner!"),),
              ),
            ),
          ),
        ),
      ),
    );
  

введите описание изображения здесь

https://docs.flutter.io/flutter/widgets/ClipRect-class.html

Поскольку вы нашли время и опубликовали как пример кода, так и изображение, я решил вернуть услугу.

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

1. Большое спасибо за подробный ответ!

2. Ну, вы задали умеренно подробный вопрос

3. Добавление ClipRRect делает свое дело. Спасибо за ответ

Ответ №2:

Оберните свой Banner внутренний ClipRect виджет и удалите поля :

             ClipRect(
                      child: Banner(
                        message: "hello",
                        location: BannerLocation.topEnd,
                        color: Colors.red,
                        child: Container(
                          color: Colors.yellow,
                          height: 100,
                          child: Center(
                            child: Text("Hello, banner!"),
                          ),
                        ),
                      ),
                    ),
  

Ответ №3:

Подумайте о замене баннера и его дочернего элемента, контейнера. В вашем коде баннер размещается на контейнере. Вместо этого поместите его на карточку. Это должно выглядеть примерно так

 Scaffold(
    body: Center(
      child: Container(
        margin: const EdgeInsets.all(10.0),
        color: Colors.yellow,
        height: 100,
        child: Banner(
          message: "hello",
          location: BannerLocation.topEnd,
          color: Colors.red,
          child: Center(child: Text("Hello, banner!"),),
        ),
      ),
    ),
  );