Ошибка флаттера - конкретный виджет, который не смог найти предка материала, был:

Я использую Align виджет, чтобы разместить кнопку со значком внизу по центру экрана.

Однако я получаю следующую ошибку и не могу ее исправить:

The specific widget that could not find a Material ancestor was: IconButton

Мой код:

return Stack(
  children: <Widget>[
    Container(
      child: GoogleMap(
        initialCameraPosition:
        CameraPosition(target: LatLng(1,1), zoom: 15),
        onMapCreated: (map) {
          mapReady;
        },),
    ),
    Align(
      alignment:Alignment.bottomCenter,
      child: IconButton(
          icon: Icon(Icons.next_week), onPressed: (){}),
    )
  ],

Если я заменю виджет IconButton, например, текстовым виджетом, он будет работать нормально.

Не могли бы вы объяснить, почему это не работает, зачем IconButton нужен предок Material?

2 ответа

Решение

Потому что согласно документации IconButton (https://api.flutter.dev/flutter/material/IconButton-class.html)

Значок кнопки - это изображение, напечатанное на виджете материала, которое реагирует на прикосновения, заполняясь цветом (чернилами).

[..]

Требует, чтобы один из его предков был виджетом Material.

IconButton, скорее всего, использует ThemeData, а также другие вещи, которые обычно предоставляет MaterialApp.

Есть ли причина, по которой вы не используете MaterialApp в качестве предка?

Если вы оберните свой стек (или родительский объект в целом) с помощью Scaffold, вы не получите эту ошибку.

В этом случае, если вы оберните свой IconButton виджетом материала, я считаю, что это решит проблему:

  Align(
    alignment: Alignment.bottomCenter,
    child: Material(
        child: IconButton(icon: Icon(Icons.next_week), onPressed: () {})),
  )
Другие вопросы по тегам