flutter.widget

CustomScrollView 와 SliverAppBar

paulaner80 2019. 11. 14. 22:10
반응형




sliver는 스크롤 가능한 영역을 의미합니다. 보통 CustomScrollView 안에 위치합니다.




SliverAppBar는 일반적으로 CustomScrollView의 첫째 자식으로 사용됩니다. 

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: CustomScrollView(
        slivers: <Widget>[
          SliverAppBar(
            title: Text("SliverAppBar"),
          )
        ],
      ),
    );
  }
}





CustomScrollView를 채우기위해서 SliverAppBar로 앱바를 만들었고, 이제 차일드위젯에 SliveList혹은 SliveGrid를 추가할 수 있습니다.


SliverList(
delegate: SliverChildBuilderDelegate(
(context, index) {
return ListTile(title: Text("Item $index"));
},
childCount: 20,
),
)




전체 소스 입니다.

더 아래에 있는 SliverAppBar의 생성자의 옵션들을 넣어 보면 기능을 알 수 있습니다.


import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}

class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);

final String title;

@override
_MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: CustomScrollView(
slivers: <Widget>[
SliverAppBar(
title: Text("SliverAppBar"),
backgroundColor: Colors.grey,
expandedHeight: 200,
flexibleSpace: Placeholder(),
//pinned: true,
floating: true,
snap: true,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(30.0),
),
),
SliverList(
delegate: SliverChildBuilderDelegate(
(context, index) {
return ListTile(title: Text("Item $index"));
},
childCount: 20,
),
)
],
),
);
}
}






SliverAppBar의 생성자 이고 테스트 해본 named parameter들의 내용입니다.


flexibleSpace

 현재는  Placeholder()가 있지만  FlexibleSpaceBar(title: Text("flexibleSpace"))를 넣어 줄 수도 있음.

 centerTitle

 타이틀을 가운데 표시할 것인가(true), 왼쪽에 표시할 것인가(false)

 titleSpacing

 타이틀과 왼쪽 보더사이의 공간인듯.

 pined

 스크롤을 올릴 때 SliverAppBar가 남아있음(true), 안 남아 있음(false)

 floating

 스크롤 내릴때 SliverAppBar가 나옴(true),  안나옴(false)

 snap

 floating이 true일 때만 true값을 가질 수 있음. floating 중간에 손을 땠을 때 SliverAppBar의 사이즈가 끝으로감(max혹은 min)(true), 그대로 멈춤(false)

 shap

 RoundedRectangleBorder를넘겼는데 ShapBorder클래스를 확장하여 다양한 모양을 만들 수 있음.





const SliverAppBar({
Key key,
this.leading,
this.automaticallyImplyLeading = true,
this.title,
this.actions,
this.flexibleSpace,
this.bottom,
this.elevation,
this.forceElevated = false,
this.backgroundColor,
this.brightness,
this.iconTheme,
this.actionsIconTheme,
this.textTheme,
this.primary = true,
this.centerTitle,
this.titleSpacing = NavigationToolbar.kMiddleSpacing,
this.expandedHeight,
this.floating = false,
this.pinned = false,
this.snap = false,
this.shape,
})


https://flutter.dev/docs/cookbook/lists/floating-app-bar

'flutter.widget' 카테고리의 다른 글

Widget  (0) 2019.11.15
NestedScrollView  (0) 2019.11.15
FlexibleSpaceBar  (0) 2019.11.14
gridView  (0) 2019.11.08
가로 리스트뷰  (0) 2019.05.03