Основываясь на ответе Саэда Набила, я несколько раз настраивал его образец, используя TextStyle.lerp
, чтобы получить текстовый стиль в соответствии с перетаскиваемой позицией.
StreamController<double> controller = StreamController.broadcast();
class MyWidget extends StatefulWidget {
@override
_MyWidgetState createState() => _MyWidgetState();
}
const defaultTextStyle = TextStyle(
color: Colors.blue,
fontSize: 15,
);
class _MyWidgetState extends State<MyWidget> {
double position;
TextStyle textStyle = defaultTextStyle;
@override
Widget build(BuildContext context) {
final maxPosition = MediaQuery.of(context).size.height - 300;
return Container(
child: Center(
child: RaisedButton(
child: Text('Show Buttom Sheet'),
onPressed: () {
showModalBottomSheet(
isScrollControlled: true,
context: context,
builder: (context) {
return StreamBuilder(
stream: controller.stream,
builder: (context, snapshot) => GestureDetector(
onVerticalDragUpdate: (DragUpdateDetails details) {
position = MediaQuery.of(context).size.height -
details.globalPosition.dy;
double newPosition = position;
if (position.isNegative || position == 0)
Navigator.pop(context);
else {
if (position > maxPosition) {
newPosition = maxPosition;
}
controller.add(newPosition);
}
textStyle = TextStyle.lerp(
defaultTextStyle,
TextStyle(
color: Colors.black,
fontSize: 24,
),
newPosition / maxPosition);
},
behavior: HitTestBehavior.translucent,
child: Container(
color: Colors.white,
height: snapshot.hasData ? snapshot.data : 50.0,
width: double.infinity,
child: Text(
'Reviews',
style: textStyle,
textAlign: TextAlign.center,
),
)),
);
});
}),
),
);
}
}
Результат