Flutter Cookbook (Lists, Images)

Updated:

Flutter Cookbook

1.Lists

Create a grid list

  • items 를 표시할때 GridView widget 을 통해 쉽게 grid view 나타낼 수 있습니다. GridView.count() constructor rows 또는 columns 를 만들수 있습니다

  • 예시로, GridView 를 통해 100 개의 list 를 생성합니다

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    const title = 'Grid List';

    return MaterialApp(
      title: title,
      home: Scaffold(
        appBar: AppBar(
          title: const Text(title),
        ),
        body: GridView.count(
          // grid 2 columns 생성
          crossAxisCount: 2,
          // 100 개의 list 생성
          children: List.generate(100, (index) {
            return Center(
              child: Text(
                'Item $index',
                style: Theme.of(context).textTheme.headline5,
              ),
            );
          }),
        ),
      ),
    );
  }
}

Kapture 2021-10-27 at 21 05 08

Create lists with different types of items

  • 통일된 lists 가 아닌 다른 타입, 스타일로 list 를 만드는 방법입니다.
import 'package:flutter/material.dart';

void main() {
  runApp(
    MyApp(),
  );
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    //
    final List<ListItem> items = List<ListItem>.generate(
      1000,
      (i) => i % 6 == 0
          ? HeadingItem('Heading $i')
          : MessageItem('Sender $i', 'Message body $i'),
    );

    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Mixed List'),
        ),
        body: ListView.builder(
          // items 의 길이 만큼 itemCount
          itemCount: items.length,
          // itemBuilder : 각 item 을 위젯 베이스 타입으로 만듬
          itemBuilder: (context, index) {
            final item = items[index];
            // ListTile return
            return ListTile(
              title: item.buildTitle(context),
              subtitle: item.buildSubtitle(context),
            );
          },
        ),
      ),
    );
  }
}

// ListItem 추상 클래스
abstract class ListItem {
  // title 라인 리스트 아이템을 나타내는 부분
  Widget buildTitle(BuildContext context);

  // subtiltle 라인, 리스트 아이템을 나타내는 부분
  Widget buildSubtitle(BuildContext context);
}

// heading 부분의 contains 디스플레이 부분에 나타내는 부분
class HeadingItem implements ListItem {
  final String heading;

  // constructor 생성
  HeadingItem(this.heading);

  @override
  Widget buildTitle(BuildContext context) {
    return Text(
      heading,
      style: Theme.of(context).textTheme.headline5,
    );
  }

  @override
  Widget buildSubtitle(BuildContext context) => const SizedBox.shrink();
}

// MessageItem 이 ListItem 에 나타 내는 부분
class MessageItem implements ListItem {
  final String sender;
  final String body;

  MessageItem(this.sender, this.body);

  @override
  Widget buildTitle(BuildContext context) => Text(sender);

  @override
  Widget buildSubtitle(BuildContext context) => Text(body);
}

Kapture 2021-10-28 at 08 10 36

Place a floating app bar above a list

  • floating appBar 가 리스트 scroll down 할때 사라지게 하는 기능을 구현할 수 있습니다.

Check point!

  • CustomScrollView 생성

  • SilverAppBar 를 사용해서 floating app bar 에 추가하기

  • SilverList 사용해서 list items 를 추가하기

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    const title = 'Floating App Bar';

    return MaterialApp(
      title: title,
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        // Floating AppBar 는 AppBar 에 추가해서 사용하는것이 아니라 body 부분에 CustomScrollView 안에 추가해서 사용함
        body: CustomScrollView(
          // silvers viewport 위치
          slivers: [
            // CustomScrollView 안에 appBar 를 사용하기 위해 SilverAppBar 호출
            const SliverAppBar(
              // SliverAppBar 의 title
              title: Text(title),
              // floating action true : 유저가 스크롤 시작할때 floating 기능이 시작될 수 있게 설정
              floating: true,
              // Placeholder widget 을 호출해서 육안으로 줄어드는 크기를 조절합니다
              flexibleSpace: Placeholder(),
              // 초기 appBar 의 크기를 설정함
              expandedHeight: 200,
            ),
            // appBar 밑의 body 부분의 list 를 SilverList 로 생성
            SliverList(
              // delegate : SliverChildBuilderDelegate 호출해서 각 item 들이 스크롤 할때 나타날 수 있게 함
              delegate: SliverChildBuilderDelegate(
                // return ListTile 이 각각 의 title 이고 index 의 item dp 각각 붙게 사용
                (context, index) => ListTile(title: Text('Item #$index')),
                // 100 개의 list item 사용
                childCount: 100,
              ),
            ),
          ],
        ),
      ),
    );
  }
}

Work with long lists

ListView constructor 를 사용해서 small lists 에게는 표준이지만, items 가 크게 되면 ListView.builder constructor 를 사용합니다.

Check Point!

  • data source 를 생성

  • data source 를 widgets 로 변환

import 'package:flutter/material.dart';

void main() {
  runApp(
    const MyApp(),
  );
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    const title = 'Long List';
    // 10000 개의 items list 를 생성해서 만듬
    final items = List<String>.generate(10000, (i) => 'Item $i');

    return MaterialApp(
      title: title,
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        appBar: AppBar(
          title: const Text(title),
        ),
        // ListView.builder 위젯 생성
        body: ListView.builder(
          // 길이는 items 의 길이 만큼 count
          itemCount: items.length,
          // itemBuilder 를 사용해서 ListTile 생성
          itemBuilder: (context, index) {
            return ListTile(
              title: Text(items[index]),
            );
          },
        ),
      ),
    );
  }
}

Use list with Icons

ListView 을 사용해서 위젯의 leading 부분에 Icon을 배치해서 list 를 사용해서 list 를 만듬니다

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    const title = 'Basic List';

    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: title,
      home: Scaffold(
        appBar: AppBar(
          title: const Text(title),
        ),
        // ListView 위젯 생성
        body: ListView(
          children: const <Widget>[
            // ListTile 마다 leading 에 Icon 나타 내기
            ListTile(
              leading: Icon(Icons.map),
              title: Text('Map'),
            ),
            ListTile(
              leading: Icon(Icons.photo_album),
              title: Text('Album'),
            ),
            ListTile(
              leading: Icon(Icons.phone),
              title: Text('Phone'),
            ),
          ],
        ),
      ),
    );
  }
}

image

Create a horizontal list

옆으로 horizontal scroll 하는 기능 구현입니다

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    const title = 'Horizontal List';

    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: title,
      home: Scaffold(
        appBar: AppBar(
          title: const Text(title),
        ),
        // Container 생성
        body: Container(
          margin: const EdgeInsets.symmetric(vertical: 100.0),
          height: 200.0,
          // ListView 생성해서 children 을 각 Container 로 받음
          child: ListView(
            // scroll 방향을 horizontal 방향으로 되게 함
            scrollDirection: Axis.horizontal,
            children: <Widget>[
              Container(
                width: 160.0,
                color: Colors.red,
              ),
              Container(
                width: 160.0,
                color: Colors.blue,
              ),
              Container(
                width: 160.0,
                color: Colors.green,
              ),
              Container(
                width: 160.0,
                color: Colors.yellow,
              ),
              Container(
                width: 160.0,
                color: Colors.orange,
              ),
            ],
          ),
        ),
      ),
    );
  }
}

Implement swipe to dismiss

“swipe to dismiss” 는 mobile app 에서 흔희 있는 기능으로서 리스트의 item 을 삭제하고자 하면 옆으로 swipe 하면 list item 이 삭제 되는 기능을 가리 킵니다. flutter 에서는 Dismissible Widget 을 사용해서 기능을 구현합니다

Check point!

  • list items 생성

  • 각 items 를 Dismissible widget 으로 wrap 함

  • leave behind check 되는 스낵바 생성

import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

// 아이템이 삭제되고 변형되는게 업데이트되야 되기때문에 Stateful widget 생성
class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  MyAppState createState() {
    return MyAppState();
  }
}

class MyAppState extends State<MyApp> {
  // 리스트 items 20 개 생성
  final items = List<String>.generate(20, (i) => 'Item ${i + 1}');

  @override
  Widget build(BuildContext context) {
    const title = 'Dismissing Items';

    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: title,
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: const Text(title),
        ),
        // ListView builder 생성
        body: ListView.builder(
          // list 의 길이는 items 의 길이 만큼
          itemCount: items.length,
          // itemBuilder 생성
          itemBuilder: (context, index) {
            // item 들의 key 값을 생성하기 위한 각 items 의 index 값을 item 으로 변수 선언
            final item = items[index];
            // return 값으로 Dismissible widget 생성
            return Dismissible(
              // Dismissible 의 반드시 key 값을 가지고 있어야 하는데 각 widget 들의 고유값으로 key 값을 가지고 있어야 한다
              key: Key(item),
              // swap 하면 list 삭제 기능
              onDismissed: (startToEnd) {
                // setState 로 실제 기능이 삭제 되게 함
                setState(() {
                  items.removeAt(index);
                });

                // Then show a snackbar.
                ScaffoldMessenger.of(context)
                    .showSnackBar(SnackBar(content: Text('$item dismissed')));
              },
              // dismiss 부분 디자인 (icon, text)
              background: Container(
                color: Colors.red,
                child: Padding(
                  padding: const EdgeInsets.all(20),
                  child: Row(
                    children: const <Widget>[
                      Icon(
                        Icons.delete,
                        color: Colors.white,
                      ),
                      SizedBox(width: 30),
                      Text(
                        'Delete item',
                        style: TextStyle(color: Colors.white),
                      ),
                    ],
                  ),
                ),
              ),
              // ListTile 호출
              child: ListTile(
                title: Text(item),
              ),
            );
          },
        ),
      ),
    );
  }
}

Kapture 2021-10-28 at 09 24 04


🔶 🔷 📌 🔑

Reference

Flutter cookbook - https://flutter.dev/docs/cookbook

Categories:

Updated:

Leave a comment