> Frontend/Flutter

Flutter_10. Custom List & Formatting Data

Janku 2023. 5. 3. 23:30

0. 공부내용

   - Custom List 만들기 (Spacer 사용)

   - Icons 와 Date Format을 사용해 모델 업데이트

 

1. Custom List 만들기 

import 'package:flutter/material.dart';
import 'package:flutter06_expense/models/expense.dart';

class ExpenseItem extends StatelessWidget {
  const ExpenseItem({super.key, required this.expense});

  final Expense expense;

  @override
  Widget build(BuildContext context) {
    return Card(
      child: Padding(
        padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 30),
        child: Column(
          children: [
            Text(expense.title),
            const SizedBox(height: 4),
            Row(
              children: [
                Text('\$${expense.amount.toStringAsFixed(2)}'), // two decimal point
                const Spacer(), // tell flutter to take all the space it can get
                Row(
                  children: [
                    Icon(categoryIcons[expense.category]),
                    const SizedBox(width: 8),
                    Text(expense.formattedDate)
                  ],
                ),
              ],
            )
          ],
        ),
      ),
    ); // used for styling
  }
}

<expense_item.dart>

   -  Space :

      -> Row / Column과 같은 Flex 공간에서 위젯과 위젯 사이의 가격을 조정하는 사용 

      -> mainAxisAlignment에 설정한 속성을 싸그리 무시

 

   - Expense_list 내용을 아래 내용으로 변경

return ListView.builder(
  itemCount: expenses.length, // number of length
  itemBuilder: (BuildContext context, int index) {
    return ExpenseItem(expense: expenses[index]);
  },
);

 

 

2 . 기존에 사용되던 expense model 변경

 

import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:uuid/uuid.dart';
import 'package:intl/intl.dart';

final formatter = DateFormat.yMd();
const uuid = Uuid();

enum Category { food, travel, leisure, work }
// enum is used to create a fixed set of allowed values, so that we have to use one of those values when creating new expense.

const categoryIcons = {
  Category.food: Icons.lunch_dining,
  Category.travel: Icons.flight_takeoff,
  Category.leisure: Icons.movie,
  Category.work: Icons.work
};

class Expense {
  Expense({
    required this.title,
    required this.amount,
    required this.date,
    required this.category,
  }) : id = uuid.v4();

  // in Dart, 'Initializer Lists' can be used to initialize class properties with values that are Not received as constructor function arguments
  // Basically, when this Expense class initialized, it will be assign as an initial value to ID property

  final String id;
  final String title;
  final double amount;
  final DateTime date;
  final Category category;


  String get formattedDate {
    return formatter.format(date);
  }


}

   - 변경점

      -> categoryIcons obj로 생성하여 받는 값에 따라 해당되는 icon 노출

      -> formattedDate getter를 생성해, intl 이라는 3rd pary library date format 잡아준다(flutter pub add intl 로 설치 후, 사용 )

 

- 위에 작성한 expense_item 내에 아래와 같이 import 후 사용가능하다 

children: [
  Icon(categoryIcons[expense.category]),
  const SizedBox(width: 8),
  Text(expense.formattedDate)
],