Dart 语言 构建自定义颜色选择器

Dart阿木 发布于 2025-06-19 7 次阅读


自定义颜色选择器在Dart语言中的应用

在移动应用开发中,颜色选择器是一个常用的功能,它允许用户选择或自定义界面中的颜色。在Dart语言中,我们可以使用Flutter框架来构建一个自定义的颜色选择器。本文将围绕这一主题,详细介绍如何在Dart语言中使用Flutter框架构建一个功能丰富的自定义颜色选择器。

环境准备

在开始编写代码之前,请确保你已经安装了Dart和Flutter环境。你可以通过以下命令来安装:

bash

安装Dart SDK


dart --version

安装Flutter SDK


flutter --version


项目结构

在Flutter项目中,我们将创建以下文件和文件夹:


my_color_picker/


├── lib/


│ ├── main.dart


│ └── color_picker.dart


└── pubspec.yaml


pubspec.yaml

在`pubspec.yaml`文件中,我们需要添加以下依赖项:

yaml

name: my_color_picker


description: A new Flutter application.


version: 0.0.1

dependencies:


flutter:


sdk: flutter


cupertino_icons: ^1.0.2

dev_dependencies:


flutter_test:


sdk: flutter


ColorPicker类

在`lib/color_picker.dart`文件中,我们将定义一个`ColorPicker`类,它将包含颜色选择器的逻辑和UI。

dart

import 'package:flutter/material.dart';

class ColorPicker extends StatefulWidget {


final Color? initialColor;

ColorPicker({this.initialColor});

@override


_ColorPickerState createState() => _ColorPickerState();


}

class _ColorPickerState extends State<ColorPicker> {


Color _selectedColor = Colors.black;

@override


void initState() {


super.initState();


if (widget.initialColor != null) {


_selectedColor = widget.initialColor!;


}


}

void _onColorChanged(Color color) {


setState(() {


_selectedColor = color;


});


}

@override


Widget build(BuildContext context) {


return Column(


mainAxisAlignment: MainAxisAlignment.center,


children: <Widget>[


ColorPickerCanvas(


onColorChanged: _onColorChanged,


initialColor: _selectedColor,


),


SizedBox(height: 20),


ColorPickerPalette(


onColorChanged: _onColorChanged,


initialColor: _selectedColor,


),


],


);


}


}

class ColorPickerCanvas extends StatefulWidget {


final ValueChanged<Color> onColorChanged;


final Color initialColor;

ColorPickerCanvas({required this.onColorChanged, required this.initialColor});

@override


_ColorPickerCanvasState createState() => _ColorPickerCanvasState();


}

class _ColorPickerCanvasState extends State<ColorPickerCanvas> {


final ValueChanged<Color> _onColorChanged = (Color color) {


widget.onColorChanged(color);


};

@override


Widget build(BuildContext context) {


return Container(


width: 200,


height: 200,


color: widget.initialColor,


child: GestureDetector(


onPanUpdate: (details) {


final offset = details.globalPosition - Offset(100, 100);


final color = Color.lerp(widget.initialColor, Colors.white, offset.dx / 100);


_onColorChanged(color!);


},


),


);


}


}

class ColorPickerPalette extends StatefulWidget {


final ValueChanged<Color> onColorChanged;


final Color initialColor;

ColorPickerPalette({required this.onColorChanged, required this.initialColor});

@override


_ColorPickerPaletteState createState() => _ColorPickerPaletteState();


}

class _ColorPickerPaletteState extends State<ColorPickerPalette> {


final ValueChanged<Color> _onColorChanged = (Color color) {


widget.onColorChanged(color);


};

@override


Widget build(BuildContext context) {


return Container(


width: 200,


height: 50,


color: widget.initialColor,


child: ListView(


scrollDirection: Axis.horizontal,


children: <Widget>[


for (int i = 0; i < 256; i++)


ColorSquare(


color: Color.lerp(Colors.black, Colors.white, i / 255),


onPressed: () => _onColorChanged(Color.lerp(Colors.black, Colors.white, i / 255)!),


),


],


),


);


}


}

class ColorSquare extends StatelessWidget {


final Color color;


final VoidCallback onPressed;

ColorSquare({required this.color, required this.onPressed});

@override


Widget build(BuildContext context) {


return GestureDetector(


onTap: onPressed,


child: Container(


width: 20,


height: 20,


color: color,


),


);


}


}


main.dart

在`lib/main.dart`文件中,我们将创建一个简单的应用,其中包含我们的自定义颜色选择器。

dart

import 'package:flutter/material.dart';


import 'color_picker.dart';

void main() {


runApp(MyApp());


}

class MyApp extends StatelessWidget {


@override


Widget build(BuildContext context) {


return MaterialApp(


title: 'Color Picker Demo',


theme: ThemeData(


primarySwatch: Colors.blue,


),


home: ColorPickerScreen(),


);


}


}

class ColorPickerScreen extends StatelessWidget {


@override


Widget build(BuildContext context) {


return Scaffold(


appBar: AppBar(


title: Text('Color Picker Demo'),


),


body: Center(


child: ColorPicker(),


),


);


}


}


总结

通过以上代码,我们使用Dart语言和Flutter框架创建了一个简单的自定义颜色选择器。这个颜色选择器允许用户通过拖动和选择调色板中的颜色来选择颜色。这个例子展示了如何在Flutter中创建自定义UI组件,以及如何处理用户交互。

这个自定义颜色选择器只是一个起点,你可以根据需要添加更多的功能和样式。例如,你可以添加颜色历史记录、颜色预览、颜色名称显示等。通过不断实践和探索,你可以创建出更加丰富和实用的颜色选择器。