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/reorderable_list_view_screen.dart';
import 'package:scrollable_widgets/screen/single_child_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',
),
];
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()),
),
),
);
}
}
/single_child_scroll_view_screen.dart
import 'package:flutter/material.dart';
import 'package:scrollable_widgets/const/colors.dart';
import 'package:scrollable_widgets/layout/main_layout.dart';
class SingleChildScrollViewScreen extends StatelessWidget {
List<int> numbers = List.generate(
100,
(index) => index,
);
SingleChildScrollViewScreen({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MainLayout(
title: 'SingleChildScrollViewScreen',
body: renderPerformance(),
);
}
// 1
// 기본 렌더링법
Widget renderSimple() {
return SingleChildScrollView(
child: Column(
children: rainbowColors
.map(
(e) => renderContainer(color: e),
)
.toList(),
),
);
}
// 2
// 화면을 넘어가지 않아도 스크롤 되게하기
Widget renderAlwaysScroll() {
return SingleChildScrollView(
// NeverScrollableScrollPhysics - 스크롤 안됨
physics: AlwaysScrollableScrollPhysics(),
child: Column(
children: [renderContainer(color: Colors.black)],
),
);
}
// 3
// 위젯이 잘리지 않게 하기
Widget renderClip() {
return SingleChildScrollView(
clipBehavior: Clip.none,
physics: AlwaysScrollableScrollPhysics(),
child: Column(
children: [renderContainer(color: Colors.black)],
),
);
}
// 4
// 여러가지 physics 정리
Widget renderPhysics() {
return SingleChildScrollView(
// NeverScrollableScrollPhysics - 스크롤 안됨
// AlwaysScrollableScrollPhysics - 스크롤 됨
// BouncingScrollPhysics - iOS 스타일
// ClampingScrollPhysics - Android 스타일
physics: ClampingScrollPhysics(),
child: Column(
children: rainbowColors
.map(
(e) => renderContainer(color: e),
)
.toList()),
);
}
// 5
// SingleChildScrollView 퍼포먼스
Widget renderPerformance() {
return SingleChildScrollView(
child: Column(
children: numbers
.map(
(e) => renderContainer(
color: rainbowColors[e % rainbowColors.length],
index: e,
),
)
.toList(),
),
);
}
Widget renderContainer({
required Color color,
int? index,
}) {
if (index != null) {
print(index);
}
return Container(
height: 300,
color: color,
);
}
}
5)

'개발이 좋아서 > Flutter가 좋아서' 카테고리의 다른 글
[flutter] Scrollable Widgets_GridView (0) | 2023.01.26 |
---|---|
[flutter] Scrollable Widgets_ListView (0) | 2023.01.26 |
[flutter] 켈린더 스케쥴러_최종 (0) | 2023.01.25 |
[flutter] 켈린더 스케쥴러_database 생성 (0) | 2023.01.18 |
[flutter] 켈린더 스케쥴러_UI 구현 (0) | 2023.01.17 |