wear_plus/lib/src/shape_widget.dart
2025-04-04 17:10:58 +02:00

95 lines
2.1 KiB
Dart

import 'package:flutter/widgets.dart';
import 'package:wear_plus/src/wear.dart';
/// Shape of a Wear device
enum WearShape {
/// The display is square
square,
/// The display is round
round,
}
/// Builds a child for a [WatchShape]
typedef WatchShapeBuilder = Widget Function(
BuildContext context,
WearShape shape,
Widget? child,
);
/// Builder widget for watch shapes
@immutable
class WatchShape extends StatefulWidget {
/// Constructor
const WatchShape({
super.key,
required this.builder,
this.child,
});
/// Built when the shape changes
final WatchShapeBuilder builder;
/// Optional child that will not get rebuilt when the shape changes
final Widget? child;
/// Call [WatchShape.of(context)] to retrieve the shape further down
/// in the widget hierarchy.
static WearShape of(BuildContext context) {
return _InheritedShape.of(context).shape;
}
@override
State<StatefulWidget> createState() => _WatchShapeState();
}
class _WatchShapeState extends State<WatchShape> {
// Default to round until the platform returns the shape
// round being the most common form factor for WearOS
var _shape = WearShape.round;
@override
void initState() {
super.initState();
_initState();
}
void _initState() async {
final shape = await Wear.instance.getShape();
if (!mounted) return;
setState(
() => _shape = (shape == 'round' ? WearShape.round : WearShape.square),
);
}
@override
Widget build(BuildContext context) {
return _InheritedShape(
shape: _shape,
child: Builder(
builder: (context) {
return widget.builder(context, _shape, widget.child);
},
),
);
}
}
class _InheritedShape extends InheritedWidget {
/// Constructor
const _InheritedShape({
required this.shape,
required super.child,
});
final WearShape shape;
static _InheritedShape of(BuildContext context) {
return context.dependOnInheritedWidgetOfExactType<_InheritedShape>()!;
}
@override
bool updateShouldNotify(_InheritedShape oldWidget) =>
shape != oldWidget.shape;
}