Scaffold를 사용하는 경우#
- Modal bottom sheet 안에서
Scaffold
의 AppBar
를 활용하는 경우
ModalBottomSheetRoute
의 border radius와 Clip.hardEdge
를 설정한다.
showModalBottomSheet()
를 사용하는 경우:
showModalBottomSheet(
context: context,
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.vertical(
top: Radius.circular(24),
),
),
clipBehavior: Clip.hardEdge,
builder: (context) => Scaffold(
appBar: AppBar(...),
body: Container(...),
),
)
Navigator.push
에 ModalBottomSheetRoute
를 직접 사용하는 경우:
final route = MaterialPageRoute(
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.vertical(
top: Radius.circular(24),
),
),
clipBehavior: Clip.hardEdge,
builder: (context) => Scaffold(
appBar: AppBar(...),
body: Container(...),
),
);
Navigator.of(context).push(route);
Scaffold
없이 Container
같은 일반 widget을 사용할 때는 Container
의 decoration에서 border를 설정할 수 있다.
- 먼저
ModalBottomSheetRoute
의 backgroundColor
를 Colors.transparent
로 제거한다.
showModalBottomSheet(
context: context,
backgroundColor: Colors.transparent,
builder: (context) => const Container(...),
)
- 이후 builder에서 반환하는
Container
의 decoration에서 border radius와 Clip.hardEdge
를 설정한다.
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.vertical(top: Radius.circular(24)),
),
clipBehavior: Clip.hardEdge,
child: SomeWidget(),
)
showModalBottomSheet(
context: context,
// 1. 전체 배경은 투명하게
backgroundColor: Colors.transparent,
// 2. Container로 border radius 설정
builder: (context) => const Container(
// 3. 필요하다면 content 영역 높이 고정 가능
height: MediaQuery.sizeOf(context) * 0.8,
decoration: BoxDecoration(
borderRadius: BorderRadius.vertical(
top: Radius.circular(24),
),
),
clipBehavior: Clip.hardEdge,
// 4. Scaffold의 background color와 appBar, body 적용
child: Scaffold(
appBar: AppBar(...),
body: SomeWidget(...),
),
),
);
- Border radius와
Clip.hardEdge
를 설정한 Container
의 child로 Scaffold
를 사용하면 비슷한 효과를 줄 수 있다.
Scaffold
를 감싸는 Container
를 활용해서 modal bottom sheet를 특정 높이로 고정시키는 등 customizing에 용이하다.