1)
2) const
/colors.dart
import 'package:flutter/material.dart';
const rainbowColors = [
Colors.red,
Colors.orange,
Colors.yellow,
Colors.green,
Colors.blue,
Colors.indigo,
Colors.purple,
];
3) layout
/main_layout.dart
import 'package:flutter/material.dart';
class MainLayout extends StatelessWidget {
final String title;
final Widget body;
const MainLayout({
required this.title,
required this.body,
Key? key,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(title),
),
body: body,
);
}
}
4) screen
/home_screen.dart
import 'package:flutter/material.dart';
import 'package:scrollable_widgets/layout/main_layout.dart';
import 'package:scrollable_widgets/screen/grid_view_screen.dart';
import 'package:scrollable_widgets/screen/list_view_screen.dart';
import 'package:scrollable_widgets/screen/refresh_indicator_screen.dart';
import 'package:scrollable_widgets/screen/reorderable_list_view_screen.dart';
import 'package:scrollable_widgets/screen/scrollbar_screen.dart';
import 'package:scrollable_widgets/screen/single_child_scroll_view_screen.dart';
import 'custom_scroll_view_screen.dart';
class ScreenModel {
final WidgetBuilder builder;
final String name;
ScreenModel({
required this.builder,
required this.name,
});
}
class HomeScreen extends StatelessWidget {
final screens = [
ScreenModel(
builder: (_) => SingleChildScrollViewScreen(),
name: 'SingleChildScrollViewScreen',
),
ScreenModel(
builder: (_) => ListViewScreen(),
name: 'ListViewScreen',
),
ScreenModel(
builder: (_) => GridViewScreen(),
name: 'GridViewScreen',
),
ScreenModel(
builder: (_) => ReorderableListViewScreen(),
name: 'ReorderableListViewScreen',
),
ScreenModel(
builder: (_) => CustomScrollViewScreen(),
name: 'CustomScrollViewScreen',
),
ScreenModel(
builder: (_) => ScrollbarScreen(),
name: 'ScrollbarScreen',
),
ScreenModel(
builder: (_) => RefreshIndicatorScreen(),
name: 'RefreshIndicatorScreen',
),
];
HomeScreen({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MainLayout(
title: 'Home',
body: Padding(
padding: const EdgeInsets.symmetric(horizontal: 8.0),
child: SingleChildScrollView(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: screens
.map(
(e) => ElevatedButton(
onPressed: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: e.builder,
),
);
},
child: Text(e.name),
),
)
.toList()),
),
),
);
}
}
/custom_scroll_view_screen.dart
import 'package:flutter/material.dart';
import 'package:scrollable_widgets/const/colors.dart';
class _SliverFixedHeaderDelegate extends SliverPersistentHeaderDelegate {
final Widget child;
final double minHeight;
final double maxHeight;
_SliverFixedHeaderDelegate({
required this.child,
required this.minHeight,
required this.maxHeight,
});
@override
Widget build(
BuildContext context, double shrinkOffset, bool overlapsContent) {
return SizedBox.expand(
child: child,
);
}
@override
// 최대 높이
double get maxExtent => maxHeight;
@override
// 최소 높이
double get minExtent => minHeight;
@override
// covariant - 상속된 클래스도 사용가능
// oldDelegate - build가 실행이 됐을 때 이전 Delegate
// this - 새로운 delegate
// shouldRebuild - 새로 build를 해야할지 말지 결정
bool shouldRebuild(_SliverFixedHeaderDelegate oldDelegate) {
return oldDelegate.maxHeight != maxHeight ||
oldDelegate.minHeight != minHeight ||
oldDelegate.child != child;
}
}
class CustomScrollViewScreen extends StatelessWidget {
final List<int> numbers = List.generate(100, (index) => index);
CustomScrollViewScreen({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
body: CustomScrollView(
slivers: [
renderSliverAppBar(),
renderHeader(),
renderBuilderSliverList(),
renderHeader(),
renderSliverGridBuilder(),
renderHeader(),
renderSliverGridBuilder(),
],
),
);
}
SliverPersistentHeader renderHeader(){
return SliverPersistentHeader(
// header가 쌓인다
pinned: true,
delegate: _SliverFixedHeaderDelegate(
child: Container(
color: Colors.black,
child: Center(
child: Text(
'신기방기',
style: TextStyle(
color: Colors.white,
),
),
),
),
minHeight: 75,
maxHeight: 150,
),
);
}
SliverAppBar renderSliverAppBar() {
return SliverAppBar(
title: Text('CustomScrollViewScreen'),
// 스크롤 했을 때 리스트의 중간에도 AppBar가 내려오게 할 수 있음.
floating: true,
// 완전 고정
pinned: false,
// 자석 효과
// floating true 에만 사용가능
snap: true,
// 맨 위에서 한계 이상으로 스크롤 했을 때
// 남는 공간을 차지
stretch: true,
expandedHeight: 200,
collapsedHeight: 150,
flexibleSpace: FlexibleSpaceBar(
title: Text('FlexibleSpace'),
background: Image.asset(
'asset/img/image_1.jpeg',
fit: BoxFit.cover,
),
),
);
}
// GridView.builder와 비슷함
SliverGrid renderSliverGridBuilder() {
return SliverGrid(
delegate: SliverChildBuilderDelegate(
(context, index) => renderContainer(
color: rainbowColors[index % rainbowColors.length],
index: index,
),
childCount: 15,
),
gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
maxCrossAxisExtent: 150,
),
);
}
// GridView.count와 유사함.
SliverGrid renderChildSliverGrid() {
return SliverGrid(
delegate: SliverChildListDelegate(
numbers
.map(
(e) => renderContainer(
color: rainbowColors[e % rainbowColors.length],
index: e,
),
)
.toList(),
),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
),
);
}
// ListView.builder 생성자와 유사함.
SliverList renderBuilderSliverList() {
return SliverList(
delegate: SliverChildBuilderDelegate(
(context, index) => renderContainer(
color: rainbowColors[index % rainbowColors.length],
index: index,
),
childCount: 15,
),
);
}
// ListView 기본 생성자와 유사함.
SliverList renderChildSliverList() {
return SliverList(
delegate: SliverChildListDelegate(
numbers
.map(
(e) => renderContainer(
color: rainbowColors[e % rainbowColors.length],
index: e,
),
)
.toList(),
),
);
}
Widget renderContainer({
required Color color,
required int index,
double? height,
}) {
print(index);
return Container(
height: height ?? 300,
color: color,
child: Center(
child: Text(
index.toString(),
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.w700,
fontSize: 30.0,
),
),
),
);
}
}
'개발이 좋아서 > Flutter가 좋아서' 카테고리의 다른 글
[flutter] Scrollable Widgets_RefreshIndicator (0) | 2023.01.27 |
---|---|
[flutter] Scrollable Widgets_Scrollbar (0) | 2023.01.27 |
[flutter] Scrollable Widgets_ReorderableListView (0) | 2023.01.26 |
[flutter] Scrollable Widgets_GridView (0) | 2023.01.26 |
[flutter] Scrollable Widgets_ListView (0) | 2023.01.26 |