返回

Flutter制作的Todo-List,打造你的生活管理利器

见解分享

本文将展示如何使用Flutter构建一个完善且用户友好的待办事项列表应用。该应用具有以下特性:

  • 直观的用户界面,可轻松添加、编辑和管理任务
  • 漂亮的主题切换,提供多样化的视觉体验
  • 自定义主题颜色,打造个性化待办事项列表

打造这款Flutter Todo-List应用,需要一定的开发经验。但我将一步步引导你完成整个过程,确保你能够理解并实现它的所有功能。

1. 创建Flutter项目

首先,使用Flutter CLI创建一个新的Flutter项目:

flutter create todo_list

2. 设置UI

lib/main.dart文件中,定义应用的主视图。它将包含一个ListView,用于显示任务列表,以及一个浮动操作按钮,用于添加新任务。

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Todo List',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  List<String> tasks = [];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Todo List'),
      ),
      body: ListView.builder(
        itemCount: tasks.length,
        itemBuilder: (context, index) {
          return ListTile(
            title: Text(tasks[index]),
          );
        },
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          setState(() {
            tasks.add('New Task');
          });
        },
        child: Icon(Icons.add),
      ),
    );
  }
}

3. 添加主题切换

lib/main.dart文件中,添加一个ThemeSwitcher类来处理主题切换。

import 'package:flutter/material.dart';

class ThemeSwitcher extends StatelessWidget {
  final List<ThemeData> themes;
  final int currentIndex;
  final Function(int) onChanged;

  const ThemeSwitcher({
    Key? key,
    required this.themes,
    required this.currentIndex,
    required this.onChanged,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Row(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        for (int i = 0; i < themes.length; i++)
          GestureDetector(
            onTap: () => onChanged(i),
            child: Container(
              width: 40,
              height: 40,
              margin: EdgeInsets.all(4),
              decoration: BoxDecoration(
                color: themes[i].primaryColor,
                shape: BoxShape.circle,
                border: Border.all(
                  color: currentIndex == i ? Colors.white : Colors.transparent,
                  width: 2,
                ),
              ),
            ),
          ),
      ],
    );
  }
}

然后,在MyHomePage中使用ThemeSwitcher

import 'package:flutter/material.dart';
import 'theme_switcher.dart';

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  // ...其他代码

  // 主题颜色列表
  List<ThemeData> themes = [
    ThemeData(primarySwatch: Colors.blue),
    ThemeData(primarySwatch: Colors.green),
    ThemeData(primarySwatch: Colors.pink),
    ThemeData(primarySwatch: Colors.purple),
    ThemeData(primarySwatch: Colors.orange),
    ThemeData(primarySwatch: Colors.teal),
  ];

  int currentIndex = 0;

  // ...其他代码

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      // ...其他代码

      // 主题切换器
      bottomNavigationBar: ThemeSwitcher(
        themes: themes,
        currentIndex: currentIndex,
        onChanged: (index) => setState(() {
          currentIndex = index;
          // 更新主题
          ThemeData theme = themes[index];
          context.theme.copyWith(
            primaryColor: theme.primaryColor,
            accentColor: theme.accentColor,
          );
        }),
      ),
    );
  }
}

4. 添加自定义主题颜色

MyHomePage中,添加一个CustomThemeColor小部件,允许用户选择自定义主题颜色。

import 'package:flutter/material.dart';

class CustomThemeColor extends StatelessWidget {
  final Function(Color) onChanged;

  const CustomThemeColor({
    Key? key,
    required this.onChanged,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Row(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        Text('Custom Color:'),
        SizedBox(width: 10),
        ColorPicker(
          pickerColor: Theme.of(context).primaryColor,
          onColorChanged: (color) => onChanged(color),
        ),
      ],
    );
  }
}

然后,在MyHomePage中使用CustomThemeColor

import 'package:flutter/material.dart';
import 'custom_theme_color.dart';

class MyHomePage extends StatefulWidget {
  // ...其他代码
}

class _MyHomePageState extends State<MyHomePage> {
  // ...其他代码

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      // ...其他代码

      // 自定义主题颜色选择器
      bottomNavigationBar: CustomThemeColor(
        onChanged: (color) {
          setState(() {
            // 更新主题
            ThemeData theme = Theme.of(context).copyWith(
              primaryColor: color,
              accentColor: color,
            );
            context.theme.copyWith(
              primaryColor: theme.primaryColor,
              accentColor: theme.accentColor,
            );
          });
        },
      ),
    );
  }
}

5. 总结

按照这些步骤,你将能够构建一个功能完善、视觉美观的Flutter Todo-List应用。通过添加主题切换和自定义主题颜色功能,你可以打造一个既实用又个性化的待办事项管理工具。

希望本教程能对你有所帮助。如果你有任何疑问,请随时留言。