ToDo app

 

 - final code

  1. pubspec.yaml

name: todo_flutter

description: A new Flutter application.

 

# The following defines the version and build number for your application.

# A version number is three numbers separated by dots, like 1.2.43

# followed by an optional build number separated by a +.

# Both the version and the builder number may be overridden in flutter

# build by specifying --build-name and --build-number, respectively.

# In Android, build-name is used as versionName while build-number used as versionCode.

# Read more about Android versioning at https://developer.android.com/studio/publish/versioning

# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.

# Read more about iOS versioning at

# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html

version: 1.0.0+1

 

environment:

  sdk: ">=2.1.0 <3.0.0"

 

dependencies:

  flutter:

    sdk: flutter

 

  # The following adds the Cupertino Icons font to your application.

  # Use with the CupertinoIcons class for iOS style icons.

  cupertino_icons: ^0.1.2

  provider: ^3.0.0+1

 

dev_dependencies:

  flutter_test:

    sdk: flutter

 

 

# For information on the generic Dart part of this file, see the

# following page: https://dart.dev/tools/pub/pubspec

 

# The following section is specific to Flutter.

flutter:

 

  # The following line ensures that the Material Icons font is

  # included with your application, so that you can use the icons in

  # the material Icons class.

  uses-material-design: true

 

  # To add assets to your application, add an assets section, like this:

  # assets:

  #  - images/a_dot_burr.jpeg

  #  - images/a_dot_ham.jpeg

 

  # An image asset can refer to one or more resolution-specific "variants", see

  # https://flutter.dev/assets-and-images/#resolution-aware.

 

  # For details regarding adding assets from package dependencies, see

  # https://flutter.dev/assets-and-images/#from-packages

 

  # To add custom fonts to your application, add a fonts section here,

  # in this "flutter" section. Each entry in this list should have a

  # "family" key with the font family name, and a "fonts" key with a

  # list giving the asset and other descriptors for the font. For

  # example:

  # fonts:

  #   - family: Schyler

  #     fonts:

  #       - asset: fonts/Schyler-Regular.ttf

  #       - asset: fonts/Schyler-Italic.ttf

  #         style: italic

  #   - family: Trajan Pro

  #     fonts:

  #       - asset: fonts/TrajanPro.ttf

  #       - asset: fonts/TrajanPro_Bold.ttf

  #         weight: 700

  #

  # For details regarding fonts from package dependencies,

  # see https://flutter.dev/custom-fonts/#from-packages

 

  1. main.dart

import 'package:flutter/material.dart';

import 'package:todoey_flutter/screens/tasks_screen.dart';

import 'package:provider/provider.dart';

import 'package:todoey_flutter/models/task_data.dart';

 

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

 

class MyApp extends StatelessWidget {

  @override

  Widget build(BuildContext context) {

    return ChangeNotifierProvider(

      builder: (context) => TaskData(),

      child: MaterialApp(

        home: TasksScreen(),

      ),

    );

  }

}

 

  1. models - task.dart

class Task {

  final String name;

  bool isDone;

 

  Task({this.name, this.isDone = false});

 

  void toggleDone() {

    isDone = !isDone;

  }

}

 

  1. models - task_data.dart

import 'package:flutter/foundation.dart';

import 'package:todoey_flutter/models/task.dart';

import 'dart:collection';

 

class TaskData extends ChangeNotifier {

  List<Task> _tasks = [

    Task(name: 'Buy milk'),

    Task(name: 'Buy eggs'),

    Task(name: 'Buy bread'),

  ];

 

  UnmodifiableListView<Task> get tasks {

    return UnmodifiableListView(_tasks);

  }

 

  int get taskCount {

    return _tasks.length;

  }

 

  void addTask(String newTaskTitle) {

    final task = Task(name: newTaskTitle);

    _tasks.add(task);

    notifyListeners();

  }

 

  void updateTask(Task task) {

    task.toggleDone();

    notifyListeners();

  }

 

  void deleteTask(Task task) {

    _tasks.remove(task);

    notifyListeners();

  }

}

 

  1. screens - add_task.dart

import 'package:flutter/material.dart';

import 'package:todoey_flutter/models/task.dart';

import 'package:provider/provider.dart';

import 'package:todoey_flutter/models/task_data.dart';

 

class AddTaskScreen extends StatelessWidget {

  @override

  Widget build(BuildContext context) {

    String newTaskTitle;

 

    return Container(

      color: Color(0xff757575),

      child: Container(

        padding: EdgeInsets.all(20.0),

        decoration: BoxDecoration(

          color: Colors.white,

          borderRadius: BorderRadius.only(

            topLeft: Radius.circular(20.0),

            topRight: Radius.circular(20.0),

          ),

        ),

        child: Column(

          crossAxisAlignment: CrossAxisAlignment.stretch,

          children: <Widget>[

            Text(

              'Add Task',

              textAlign: TextAlign.center,

              style: TextStyle(

                fontSize: 30.0,

                color: Colors.lightBlueAccent,

              ),

            ),

            TextField(

              autofocus: true,

              textAlign: TextAlign.center,

              onChanged: (newText) {

                newTaskTitle = newText;

              },

            ),

            FlatButton(

              child: Text(

                'Add',

                style: TextStyle(

                  color: Colors.white,

                ),

              ),

              color: Colors.lightBlueAccent,

              onPressed: () {

                Provider.of<TaskData>(context).addTask(newTaskTitle);

                Navigator.pop(context);

              },

            ),

          ],

        ),

      ),

    );

  }

}

 

  1. screens - tasks_screen.dart

import 'package:flutter/material.dart';

import 'package:todoey_flutter/widgets/tasks_list.dart';

import 'package:todoey_flutter/screens/add_task_screen.dart';

import 'package:provider/provider.dart';

import 'package:todoey_flutter/models/task_data.dart';

 

class TasksScreen extends StatelessWidget {

  @override

  Widget build(BuildContext context) {

    return Scaffold(

      backgroundColor: Colors.lightBlueAccent,

      floatingActionButton: FloatingActionButton(

        backgroundColor: Colors.lightBlueAccent,

        child: Icon(Icons.add),

        onPressed: () {

          showModalBottomSheet(

            context: context,

            builder: (context) => AddTaskScreen(),

          );

        },

      ),

      body: Column(

        crossAxisAlignment: CrossAxisAlignment.start,

        children: <Widget>[

          Container(

            padding: EdgeInsets.only(

                top: 60.0, left: 30.0, right: 30.0, bottom: 30.0),

            child: Column(

              crossAxisAlignment: CrossAxisAlignment.start,

              children: <Widget>[

                CircleAvatar(

                  child: Icon(

                    Icons.list,

                    size: 30.0,

                    color: Colors.lightBlueAccent,

                  ),

                  backgroundColor: Colors.white,

                  radius: 30.0,

                ),

                SizedBox(

                  height: 10.0,

                ),

                Text(

                  'Todoey',

                  style: TextStyle(

                    color: Colors.white,

                    fontSize: 50.0,

                    fontWeight: FontWeight.w700,

                  ),

                ),

                Text(

                  '${Provider.of<TaskData>(context).taskCount} Tasks',

                  style: TextStyle(

                    color: Colors.white,

                    fontSize: 18,

                  ),

                ),

              ],

            ),

          ),

          Expanded(

            child: Container(

              padding: EdgeInsets.symmetric(horizontal: 20.0),

              decoration: BoxDecoration(

                color: Colors.white,

                borderRadius: BorderRadius.only(

                  topLeft: Radius.circular(20.0),

                  topRight: Radius.circular(20.0),

                ),

              ),

              child: TasksList(),

            ),

          ),

        ],

      ),

    );

  }

}

 

  1. widgets - task_tile.dart

import 'package:flutter/material.dart';

 

class TaskTile extends StatelessWidget {

  final bool isChecked;

  final String taskTitle;

  final Function checkboxCallback;

  final Function longPressCallback;

 

  TaskTile(

      {this.isChecked,

      this.taskTitle,

      this.checkboxCallback,

      this.longPressCallback});

 

  @override

  Widget build(BuildContext context) {

    return ListTile(

      onLongPress: longPressCallback,

      title: Text(

        taskTitle,

        style: TextStyle(

            decoration: isChecked ? TextDecoration.lineThrough : null),

      ),

      trailing: Checkbox(

        activeColor: Colors.lightBlueAccent,

        value: isChecked,

        onChanged: checkboxCallback,

      ),

    );

  }

}

 

  1. widgets - tasks_list.dart

import 'package:flutter/material.dart';

import 'package:todoey_flutter/widgets/task_tile.dart';

import 'package:provider/provider.dart';

import 'package:todoey_flutter/models/task_data.dart';

 

class TasksList extends StatelessWidget {

  @override

  Widget build(BuildContext context) {

    return Consumer<TaskData>(

      builder: (context, taskData, child) {

        return ListView.builder(

          itemBuilder: (context, index) {

            final task = taskData.tasks[index];

            return TaskTile(

              taskTitle: task.name,

              isChecked: task.isDone,

              checkboxCallback: (checkboxState) {

                taskData.updateTask(task);

              },

              longPressCallback: () {

                taskData.deleteTask(task);

              },

            );

          },

          itemCount: taskData.taskCount,

        );

      },

    );

  }

}

'플러터(Flutter) > 플러터 실습(Flutter Practice)' 카테고리의 다른 글

Bitcoin Ticker  (0) 2020.03.18

+ Recent posts