是的,可以观察组件的指标变化,即使不使用 WidgetsBindingObserver mixin 和 GlobalKeys。以下是一个示例代码,演示如何观察组件的指标变化。
import 'package:flutter/material.dart';
class SizeObserver extends StatefulWidget {
final Widget child;
SizeObserver({required this.child});
@override
_SizeObserverState createState() => _SizeObserverState();
}
class _SizeObserverState extends State {
Size? _previousSize;
@override
Widget build(BuildContext context) {
return LayoutBuilder(
builder: (context, constraints) {
final currentSize = constraints.biggest;
// 判断组件的指标是否发生变化
if (_previousSize != currentSize) {
// 执行指标变化后的操作
print('Size changed to: $currentSize');
// 更新 previousSize
_previousSize = currentSize;
}
return widget.child;
},
);
}
}
// 示例使用
void main() {
runApp(MaterialApp(
home: Scaffold(
body: SizeObserver(
child: Center(
child: Container(
width: 200,
height: 200,
color: Colors.blue,
),
),
),
),
));
}
在上述示例中,SizeObserver 是一个 StatefulWidget,它使用 LayoutBuilder 包裹 child 组件。LayoutBuilder 提供了一个回调函数,该函数在组件的指标(如大小)发生变化时被调用。
在回调函数中,我们可以通过 constraints.biggest 获取到当前的大小。然后,我们可以将当前大小与之前的大小进行比较,以确定是否发生了指标变化。如果发生了变化,我们可以执行相应的操作,并更新 _previousSize 变量以保存当前的大小。
在示例中,我们简单地打印出新的大小,但您可以根据需要执行任何其他操作。