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()),
),
),
);
}
}
/list_view_screen.dart
import 'package:flutter/material.dart';
import 'package:scrollable_widgets/const/colors.dart';
import 'package:scrollable_widgets/layout/main_layout.dart';
class ListViewScreen extends StatelessWidget {
final List<int> numbers = List.generate(
100,
(index) => index,
);
ListViewScreen({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MainLayout(
title: 'ListViewScreen',
body: renderSeparated(),
);
}
// 1
// 모두 한번에 그림
Widget renderDefault() {
return ListView(
children: numbers
.map(
(e) => renderContainer(
color: rainbowColors[e % rainbowColors.length],
index: e,
),
)
.toList(),
);
}
// 2
// 보이는 것만 그림
Widget renderBuilder() {
return ListView.builder(
itemCount: 100,
itemBuilder: (context, index) {
return renderContainer(
color: rainbowColors[index % rainbowColors.length],
index: index,
);
},
);
}
// 3
// 2 + 중간 중간에 추가할 위젯 넣을 수 있음
Widget renderSeparated() {
return ListView.separated(
itemCount: 100,
itemBuilder: (context, index) {
return renderContainer(
color: rainbowColors[index % rainbowColors.length],
index: index,
);
},
separatorBuilder: (context, index) {
// 5개의 item마다 배너 보여주기
index += 1;
return index % 5 == 0
? renderContainer(
color: Colors.black,
index: index,
height: 100,
)
: SizedBox(
height: 32.0,
);
},
);
}
Widget renderContainer({
required Color color,
required int index,
double? height,
}) {
return Container(
height: height ?? 300,
color: color,
child: Center(
child: Text(
index.toString(),
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.w700,
fontSize: 30.0,
),
),
),
);
}
}
5)
'개발이 좋아서 > Flutter가 좋아서' 카테고리의 다른 글
[flutter] Scrollable Widgets_ReorderableListView (0) | 2023.01.26 |
---|---|
[flutter] Scrollable Widgets_GridView (0) | 2023.01.26 |
[flutter] Scrollable Widgets_SingleChildScrollView (0) | 2023.01.26 |
[flutter] 켈린더 스케쥴러_최종 (0) | 2023.01.25 |
[flutter] 켈린더 스케쥴러_database 생성 (0) | 2023.01.18 |