我正在尝试创建一个 float 小部件,它后面有一个模态屏障。如果用户点击屏障,则应弹出小部件。 我将 barrierDismissable 设置为 true。 我还想看看 Flutter ModalBottomSheets 和 Dialogs,但运气不佳。
我几乎被困在这里,我不知道我做错了什么。
import 'package:flutter/material.dart';
class TutorialOverlay extends PopupRoute<void> {
@override
Duration get transitionDuration => Duration(milliseconds: 500);
@override
// TODO: implement barrierColor
Color get barrierColor => const Color(0x80000000);
@override
// TODO: implement barrierDismissible
bool get barrierDismissible => true;
@override
// TODO: implement barrierLabel
String get barrierLabel => null;
@override
Widget buildPage(
BuildContext context,
Animation<double> animation,
Animation<double> secondaryAnimation,
) {
return Material(
type: MaterialType.transparency,
child: SafeArea(
child: _buildOverlayContent(context),
),
);
}
Widget _buildOverlayContent(BuildContext context) {
return GestureDetector(
onTap: () => print('t'),
child: Align(
alignment: Alignment.center,
child: Container(
color: Colors.red,
height: 200,
width: 200,
),
),
);
}
@override
Widget buildTransitions(BuildContext context, Animation<double> animation,
Animation<double> secondaryAnimation, Widget child) {
return FadeTransition(
opacity: animation,
child: ScaleTransition(
scale: animation,
child: child,
),
);
}
}
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Playground',
home: TestPage(),
);
}
}
class TestPage extends StatelessWidget {
void _showOverlay(BuildContext context) {
Navigator.of(context).push(TutorialOverlay());
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Test')),
body: Padding(
padding: EdgeInsets.all(16.0),
child: Center(
child: RaisedButton(
onPressed: () => _showOverlay(context),
child: Text('Show Overlay'),
),
),
),
);
}
}
最佳答案
您不能在 buildPage()
方法中使用 Material
,因为 Material
是不透明的并且会在屏障上呈现,所以您将无法点击它。
关于flutter - 点击障碍时小部件不会弹出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57013750/