feat: schwebende Eingabeleiste - Chat laeuft darunter weiter (Milchglas), Flaeche faengt Beruehrungen ab
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]>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
7063ebfceb
commit
223c9448f6
@@ -0,0 +1,37 @@
|
||||
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));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user