Как мне нарисовать InkResponse поверх других виджетов?

#flutter #flutter-layout

#flutter #flutter-макет

Вопрос:

У меня есть LeafRenderObjectWidget в Column :

 Column(children: [CustomRenderObject(), InkResponse(child: ..), ...])
 

Ниже этого есть InkResponse . Обычно заставка и подсветка из InkResponse будут отображаться над предыдущим виджетом в Column . Если бы у меня был следующий сценарий, подсветка и всплеск отображались бы над Container :

 Column(children: [Container(height: ..), InkResponse(child: ..), ...])
 

Однако в моем сценарии с the RenderObject все, что я рисую внизу моего CustomRenderObject виджета в paint методе my RenderBox , будет нарисовано над InkResponse заставкой и подсветкой.
Material Является родительским элементом Column .

Это означает, что моя InkReponse подсветка и всплеск обрезаются вверху. Я не хочу добавлять дополнительные дополнения к своему InkResponse . Как я могу сделать так, чтобы мой InkResponse рисунок был выше моего RenderBox ?

Ответ №1:

Решения этой проблемы описаны в разделе устранение InkResponse неполадок класса.

Если вы просто используете простой цветной Container или что-то подобное, вы можете вместо этого использовать Ink виджет, который будет рисовать на Material и, таким образом, отображать InkResponse подсветку и всплеск выше.

Другим решением было бы добавление Material типа MaterialType.transparency :

 Material(type: MaterialType.transparency, child: InkResponse(..))
 

Это будет прямо под самим InkResponse собой. Однако это не решает мою проблему, поскольку оно обрезает InkResponse в прямоугольник.

Ответ №2:

Заставка InkResponse будет отображаться над родительским виджетом в дереве, а не в родственных виджетах. Это объясняет, почему он рисуется в вашем Material виджете, который находится над Column , потому Column что сам по себе это просто макет MultiChildRenderObjectWidget .

Решение, которое вы предоставили, на самом деле является хорошим подходом, который иногда используется, но поскольку вы хотите отобразить эффект всплеска в своем LeafRenderObjectWidget , и поскольку у него нет дочерних элементов, Flutter не знает, где на самом деле вы хотите отобразить эффект всплеска. Боюсь, вы не можете использовать InkResponse для отображения всплесков в виджете листа.

Уродливое решение, которое может сработать, может перейти от использования a Stack к размещению каждого виджета поверх другого, но вам все равно нужно убедиться, что они будут иметь одинаковый внешний вид. Если это сложный объект рендеринга, это может быть сложно.