@@ -345,19 +345,20 @@ class LogListenerScope extends StatefulWidget {
345
345
346
346
final LogPanelBuilder ? logPanelBuilder;
347
347
348
- static LogListener ? of (BuildContext context) {
349
- return context
350
- .findAncestorStateOfType <_LogListenerScopeState >()
351
- ? .logNotifier as LogListener ;
348
+ static LogListenerScopeState ? of (BuildContext context) {
349
+ return context.findAncestorStateOfType <LogListenerScopeState >();
352
350
}
353
351
354
352
@override
355
- _LogListenerScopeState createState () => _LogListenerScopeState ();
353
+ LogListenerScopeState createState () => LogListenerScopeState ();
356
354
}
357
355
358
- class _LogListenerScopeState extends LogState <LogListenerScope > {
356
+ class LogListenerScopeState extends LogState <LogListenerScope > {
359
357
late LogListener _logListener;
360
358
359
+ // 日志面板(位于子树中,默认是LogPanel)会缓存自身的高度
360
+ double ? storage;
361
+
361
362
@override
362
363
void initState () {
363
364
_logListener = LogListener (widget.logEmitter);
@@ -458,11 +459,24 @@ class _LogPanelState extends State<LogPanel> {
458
459
double _height = 0 ;
459
460
bool _drag = false ;
460
461
late LogValueNotifier _listenable;
462
+ late LogValueNotifier _originalListenable;
463
+ LogInfo ? _last;
464
+
465
+ //每一次都从该位置开始处理
466
+ late int _lastLength;
461
467
462
468
bool get _canExpanded => widget.maxHeight - _height > .0001 ;
463
469
464
470
bool get _draggable => widget.maxHeight - widget.minHeight > 0.0001 ;
465
471
472
+ set height (double v) {
473
+ _height = v.clamp (widget.minHeight, widget.maxHeight);
474
+ final scope = LogListenerScope .of (context);
475
+ if (scope != null ) {
476
+ scope.storage = _height;
477
+ }
478
+ }
479
+
466
480
void _jumpToListEnd () {
467
481
SchedulerBinding .instance! .addPostFrameCallback ((_) {
468
482
if (mounted) {
@@ -476,12 +490,6 @@ class _LogPanelState extends State<LogPanel> {
476
490
);
477
491
}
478
492
479
- late LogValueNotifier _originalListenable;
480
- LogInfo ? _last;
481
-
482
- //每一次都从该位置开始处理
483
- int _lastLength = 0 ;
484
-
485
493
//合并相邻重复日志
486
494
void _mergeLog () {
487
495
final list = _originalListenable.value;
@@ -506,7 +514,7 @@ class _LogPanelState extends State<LogPanel> {
506
514
< LogInfo > [],
507
515
(List <LogInfo > previousValue, element) {
508
516
if (_last == null ) {
509
- _last = element;
517
+ _last = element..times = 1 ;
510
518
return previousValue..add (_last! );
511
519
} else {
512
520
if (_last! .isEqual (element)) {
@@ -515,7 +523,7 @@ class _LogPanelState extends State<LogPanel> {
515
523
return previousValue;
516
524
}
517
525
//和上一条不同
518
- _last = element;
526
+ _last = element..times = 1 ;
519
527
return previousValue..add (_last! );
520
528
}
521
529
},
@@ -534,9 +542,13 @@ class _LogPanelState extends State<LogPanel> {
534
542
'[listenable] required! Consider [LogListenerScope] as an ancestor widget.' ,
535
543
);
536
544
_originalListenable = listenable! ;
545
+ _lastLength = 0 ;
546
+ _last = null ;
537
547
if (widget.mergeDuplicateLogs) {
538
548
_listenable = LogValueNotifier ();
539
549
_originalListenable.addListener (_mergeLog);
550
+ // 可能_originalListenable已经有日志了,先触发一次合并
551
+ _originalListenable.notifyListeners ();
540
552
} else {
541
553
_listenable = _originalListenable;
542
554
}
@@ -545,14 +557,16 @@ class _LogPanelState extends State<LogPanel> {
545
557
546
558
@override
547
559
void initState () {
548
- _height = widget.minHeight;
549
- _init (widget.listenable ?? LogListenerScope .of (context));
560
+ final scope = LogListenerScope .of (context);
561
+ height = scope? .storage ?? widget.minHeight;
562
+ _init (widget.listenable ?? scope? .logListener);
550
563
super .initState ();
551
564
}
552
565
553
566
@override
554
567
void didUpdateWidget (covariant LogPanel oldWidget) {
555
- final listenable = widget.listenable ?? LogListenerScope .of (context);
568
+ final listenable =
569
+ widget.listenable ?? LogListenerScope .of (context)? .logListener;
556
570
if (widget.mergeDuplicateLogs != oldWidget.mergeDuplicateLogs ||
557
571
_originalListenable != listenable) {
558
572
_originalListenable.removeListener (_mergeLog);
@@ -572,7 +586,8 @@ class _LogPanelState extends State<LogPanel> {
572
586
573
587
@override
574
588
Widget build (BuildContext context) {
575
- _height = _height.clamp (widget.minHeight, widget.maxHeight);
589
+ //触发setter,setter中会根据最大最小高度调整日志面板高度。
590
+ height = _height;
576
591
return Material (
577
592
child: SizedBox (
578
593
height: _height,
@@ -605,7 +620,7 @@ class _LogPanelState extends State<LogPanel> {
605
620
var newHeight = _height - details.delta.dy;
606
621
if (newHeight != _height) {
607
622
setState (() {
608
- _height = newHeight;
623
+ height = newHeight;
609
624
});
610
625
}
611
626
},
@@ -633,7 +648,13 @@ class _LogPanelState extends State<LogPanel> {
633
648
else
634
649
const Spacer (),
635
650
IconButton (
636
- onPressed: () => _listenable.clear (),
651
+ onPressed: () {
652
+ // 清空日志
653
+ _originalListenable.value.clear ();
654
+ _listenable.value.clear ();
655
+ // 触发_mergeLog执行,最终会通知 ValueListenableBuilder 重新 build
656
+ _originalListenable.notifyListenersUnsafe ();
657
+ },
637
658
icon: const Icon (Icons .delete_outline),
638
659
),
639
660
IconButton (
0 commit comments