Bernds Wunsch 2026-10-07: Die Nachrichtenliste reicht jetzt bis ganz unten; Tipp-Anzeige und Eingabefeld schweben darueber. Um das Feld herum ist die Flaeche klar (Chat sichtbar), aber beruehrungsdicht - dort reagiert nur die Eingabe. Hinter dem Feld selbst Milchglas (Unschaerfe + 78 % Flaeche), Rahmen und Fokus-Ring aussen. Die Liste bekommt unten genau die gemessene Hoehe der Leiste als Abstand (MeasureSize; waechst mit Antwort-Leiste/mehrzeiligem Text), damit die neueste Nachricht ganz ueber die Leiste scrollt; der Nach-unten-Knopf sitzt darueber. Co-Authored-By: Claude Opus 5.5 <[email protected]>
38 lines
1.1 KiB
Dart
38 lines
1.1 KiB
Dart
import 'package:flutter/rendering.dart';
|
|
import 'package:flutter/widgets.dart';
|
|
|
|
/// Meldet die gezeichnete Größe des Kindes, sobald sie sich ändert (z. B.
|
|
/// die Höhe der schwebenden Eingabeleiste, die mit Antwort-Leiste oder
|
|
/// mehrzeiligem Text wächst). Die Meldung kommt nach dem Layout, damit der
|
|
/// Empfänger gefahrlos setState aufrufen kann.
|
|
class MeasureSize extends SingleChildRenderObjectWidget {
|
|
const MeasureSize({super.key, required this.onChange, super.child});
|
|
|
|
final ValueChanged<Size> onChange;
|
|
|
|
@override
|
|
RenderObject createRenderObject(BuildContext context) =>
|
|
_MeasureSizeRender(onChange);
|
|
|
|
@override
|
|
void updateRenderObject(BuildContext context, RenderObject renderObject) {
|
|
(renderObject as _MeasureSizeRender).onChange = onChange;
|
|
}
|
|
}
|
|
|
|
class _MeasureSizeRender extends RenderProxyBox {
|
|
_MeasureSizeRender(this.onChange);
|
|
|
|
ValueChanged<Size> onChange;
|
|
Size? _last;
|
|
|
|
@override
|
|
void performLayout() {
|
|
super.performLayout();
|
|
final size = this.size;
|
|
if (size == _last) return;
|
|
_last = size;
|
|
WidgetsBinding.instance.addPostFrameCallback((_) => onChange(size));
|
|
}
|
|
}
|