欢迎加入开源鸿蒙跨平台社区:
https://openharmonycrossplatform.csdn.net

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1. 项目介绍

在日常的开发工作中,代码格式化是一个非常重要的环节。良好的代码格式不仅可以提高代码的可读性,还可以减少错误和提高开发效率。极简代码片段高亮展示与格式化是一个基于 Flutter 开发的应用,它能够帮助开发者快速格式化和展示代码片段,支持多种编程语言,提供深色和浅色主题,为开发者提供一个便捷的代码处理工具。本文将详细介绍如何使用 Flutter 实现这个实用的代码格式化工具。

1.1 项目目标

  • 实现一个支持多种编程语言的代码格式化工具
  • 提供代码高亮展示功能
  • 支持代码复制到剪贴板
  • 支持深色和浅色主题切换
  • 提供简洁美观的用户界面
  • 确保在不同平台上的一致性表现

1.2 技术栈

  • Flutter:跨平台 UI 框架
  • Dart:编程语言
  • StatefulWidget:用于管理应用状态
  • TextField:用于接收用户输入
  • SelectableText:用于显示代码预览
  • Clipboard API:用于复制代码
  • ThemeData:用于实现主题切换
  • DropdownButtonFormField:用于语言选择

2. 核心功能设计

2.1 语言选择

  • 多语言支持:支持 10 种主流编程语言,包括 Dart、Python、Java、JavaScript、C++、C、C#、Go、Rust、Swift
  • 下拉选择:通过下拉菜单选择编程语言
  • 实时切换:选择语言后立即生效,无需重新加载

2.2 代码输入与格式化

  • 代码输入:提供多行文本输入框,支持输入和编辑代码
  • 代码格式化:根据选择的编程语言,按照相应的格式规则格式化代码
  • 格式化反馈:格式化完成后显示成功提示

2.3 代码预览与操作

  • 代码预览:实时预览格式化后的代码
  • 代码复制:将代码复制到剪贴板,方便在其他地方使用
  • 代码清空:清空输入框中的代码,方便重新输入

2.4 主题切换

  • 深色模式:适合在低光环境下使用,减少眼睛疲劳
  • 浅色模式:适合在明亮环境下使用,提高可读性
  • 主题切换:通过右上角的图标切换主题,立即生效

2.5 界面设计

  • 简洁布局:分为语言选择、代码输入、操作按钮和代码预览四个部分
  • 响应式设计:适应不同屏幕尺寸,在手机和桌面设备上都能良好显示
  • 视觉层次:通过卡片、阴影等元素,营造清晰的视觉层次
  • 色彩方案:深色模式使用深色背景,浅色模式使用浅色背景,提供良好的对比度

3. 技术架构

3.1 项目结构

lib/
└── main.dart          # 主应用文件,包含所有代码

3.2 组件结构

CodeSnippetApp
└── CodeSnippetScreen
    ├── State management (code, language, isFormatted, isDarkMode)
    ├── Data management (_languages)
    ├── Business logic (_formatCode, _copyCode, _clearCode, _toggleDarkMode, _formatCodeSnippet)
    ├── UI components
    │   ├── Language selection
    │   ├── Code input
    │   ├── Action buttons
    │   │   ├── Format button
    │   │   ├── Copy button
    │   │   └── Clear button
    │   ├── Code preview
    │   ├── Status information
    │   └── App instructions
    └── Helper methods
        ├── _formatDartCode
        ├── _formatPythonCode
        ├── _formatJavaCode
        ├── _formatJavaScriptCode
        ├── _formatCppCode
        ├── _formatCSharpCode
        ├── _formatGoCode
        ├── _formatRustCode
        └── _formatSwiftCode

3.3 数据模型

  • _languages:支持的编程语言列表
  • _code:用户输入的代码
  • _language:当前选择的编程语言
  • _isFormatted:代码是否已格式化的状态
  • _isDarkMode:是否启用深色模式的状态

4. 关键代码解析

4.1 语言选择

final List<String> _languages = [
  'dart',
  'python',
  'java',
  'javascript',
  'cpp',
  'c',
  'csharp',
  'go',
  'rust',
  'swift',
];

DropdownButtonFormField<String>(
  value: _language,
  onChanged: (value) {
    setState(() {
      _language = value!;
    });
  },
  items: _languages.map((language) {
    return DropdownMenuItem<String>(
      value: language,
      child: Text(language),
    );
  }).toList(),
  decoration: InputDecoration(
    border: OutlineInputBorder(
      borderRadius: BorderRadius.circular(8),
    ),
    filled: true,
    fillColor: theme.cardColor,
  ),
),

代码解析

  • _languages:定义支持的编程语言列表
  • DropdownButtonFormField:创建下拉菜单,用于选择编程语言
  • value:当前选择的语言
  • onChanged:当选择改变时更新状态
  • items:根据语言列表生成下拉菜单项
  • decoration:设置下拉菜单的样式

4.2 代码格式化

void _formatCode() {
  setState(() {
    _code = _formatCodeSnippet(_code, _language);
    _isFormatted = true;
  });
}

String _formatCodeSnippet(String code, String language) {
  // 简单的代码格式化实现
  // 在实际应用中,可以使用更复杂的格式化库
  switch (language) {
    case 'dart':
      return _formatDartCode(code);
    case 'python':
      return _formatPythonCode(code);
    case 'java':
      return _formatJavaCode(code);
    case 'javascript':
      return _formatJavaScriptCode(code);
    case 'cpp':
    case 'c':
      return _formatCppCode(code);
    case 'csharp':
      return _formatCSharpCode(code);
    case 'go':
      return _formatGoCode(code);
    case 'rust':
      return _formatRustCode(code);
    case 'swift':
      return _formatSwiftCode(code);
    default:
      return code;
  }
}

代码解析

  • _formatCode 方法:调用 _formatCodeSnippet 方法格式化代码,并更新状态
  • _formatCodeSnippet 方法:根据选择的语言调用相应的格式化方法
  • switch 语句:根据语言类型选择对应的格式化方法
  • 各个语言的格式化方法:实现不同语言的代码格式化逻辑

4.3 Dart代码格式化

String _formatDartCode(String code) {
  // 简单的Dart代码格式化
  final lines = code.split('\n');
  final formattedLines = <String>[];
  int indentLevel = 0;
  const indentSize = 2;

  for (final line in lines) {
    final trimmedLine = line.trim();
    if (trimmedLine.isEmpty) {
      formattedLines.add('');
      continue;
    }

    if (trimmedLine.startsWith('}') || trimmedLine.startsWith(')') || trimmedLine.startsWith(']')) {
      indentLevel = (indentLevel - indentSize).clamp(0, indentLevel);
    }

    final indent = ' ' * indentLevel;
    formattedLines.add('$indent$trimmedLine');

    if (trimmedLine.endsWith('{') || trimmedLine.endsWith('(') || trimmedLine.endsWith('[')) {
      indentLevel += indentSize;
    }
  }

  return formattedLines.join('\n');
}

代码解析

  • _formatDartCode 方法:实现Dart代码的格式化逻辑
  • lines = code.split('\n'):将代码按行分割
  • indentLevel:跟踪当前的缩进级别
  • indentSize:设置缩进大小为2个空格
  • 遍历每一行代码,根据括号的位置调整缩进级别
  • formattedLines.join('\n'):将格式化后的行重新组合成代码

4.4 主题切换

void _toggleDarkMode() {
  setState(() {
    _isDarkMode = !_isDarkMode;
  });
}


Widget build(BuildContext context) {
  final theme = _isDarkMode ? ThemeData.dark() : ThemeData.light();

  return Theme(
    data: theme,
    child: Scaffold(
      appBar: AppBar(
        title: const Text('极简代码片段高亮展示与格式化'),
        backgroundColor: theme.primaryColor,
        actions: [
          IconButton(
            onPressed: _toggleDarkMode,
            icon: Icon(_isDarkMode ? Icons.light_mode : Icons.dark_mode),
          ),
        ],
      ),
      // 其他UI组件
    ),
  );
}

代码解析

  • _toggleDarkMode 方法:切换深色/浅色模式的状态
  • theme = _isDarkMode ? ThemeData.dark() : ThemeData.light():根据状态创建相应的主题
  • Theme 组件:应用主题到整个应用
  • IconButton:创建主题切换按钮,根据当前模式显示不同的图标

4.5 代码复制

void _copyCode() {
  Clipboard.setData(ClipboardData(text: _code));
  ScaffoldMessenger.of(context).showSnackBar(
    const SnackBar(content: Text('代码已复制到剪贴板')),
  );
}

代码解析

  • _copyCode 方法:将代码复制到剪贴板
  • Clipboard.setData:设置剪贴板数据
  • ScaffoldMessenger.of(context).showSnackBar:显示复制成功的提示

4.6 主界面构建


Widget build(BuildContext context) {
  final theme = _isDarkMode ? ThemeData.dark() : ThemeData.light();

  return Theme(
    data: theme,
    child: Scaffold(
      appBar: AppBar(
        title: const Text('极简代码片段高亮展示与格式化'),
        backgroundColor: theme.primaryColor,
        actions: [
          IconButton(
            onPressed: _toggleDarkMode,
            icon: Icon(_isDarkMode ? Icons.light_mode : Icons.dark_mode),
          ),
        ],
      ),
      body: Container(
        decoration: BoxDecoration(
          gradient: LinearGradient(
            begin: Alignment.topCenter,
            end: Alignment.bottomCenter,
            colors: _isDarkMode
                ? [Colors.grey.shade900, Colors.black]
                : [Colors.blue.shade50, Colors.white],
          ),
        ),
        child: SingleChildScrollView(
          padding: const EdgeInsets.all(24),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              // 语言选择
              // 代码输入
              // 操作按钮
              // 代码预览
              // 状态信息
              // 应用说明
            ],
          ),
        ),
      ),
    ),
  );
}

代码解析

  • build 方法:构建应用的主界面
  • Theme:应用主题到整个应用
  • AppBar:应用标题栏,包含主题切换按钮
  • Container:主容器,使用渐变背景
  • SingleChildScrollView:支持滚动,适应不同屏幕尺寸
  • Column:垂直布局,包含所有UI组件

5. 技术亮点与创新

5.1 多语言支持

  • 支持10种主流编程语言:Dart、Python、Java、JavaScript、C++、C、C#、Go、Rust、Swift
  • 每种语言都有专门的格式化逻辑:根据不同语言的语法规则进行格式化
  • 语言选择界面友好:下拉菜单选择,直观方便

5.2 代码格式化

  • 简单有效的格式化算法:根据括号的位置自动调整缩进
  • 支持不同语言的缩进规则:Dart使用2空格,其他语言使用4空格
  • 保持代码结构:格式化后保持代码的逻辑结构不变

5.3 主题切换

  • 深色/浅色模式:支持两种主题模式,适应不同的使用环境
  • 实时切换:切换主题后立即生效,无需重新加载
  • 主题一致性:整个应用的颜色、字体等都根据主题自动调整

5.4 用户交互

  • 直观的操作按钮:格式化、复制、清空三个主要操作按钮,布局合理
  • 实时反馈:格式化完成后显示成功提示,复制代码后显示复制成功提示
  • 代码预览:实时预览格式化后的代码,方便用户查看效果
  • 响应式设计:适应不同屏幕尺寸,在手机和桌面设备上都能良好显示

5.5 界面设计

  • 简洁美观:界面布局简洁,重点突出,没有冗余元素
  • 视觉层次:通过卡片、阴影等元素,营造清晰的视觉层次
  • 色彩方案:深色模式使用深色背景,浅色模式使用浅色背景,提供良好的对比度
  • 渐变背景:使用渐变背景,增强视觉效果

6. 应用场景与扩展

6.1 应用场景

  • 开发调试:在开发过程中,快速格式化代码,提高代码可读性
  • 代码分享:格式化代码后分享给他人,便于阅读和理解
  • 学习参考:查看不同语言的代码格式规范,学习良好的代码风格
  • 代码审查:在代码审查过程中,格式化代码,便于发现问题
  • 教学演示:在教学过程中,展示格式化后的代码,提高教学效果

6.2 扩展方向

  • 更多编程语言:添加更多编程语言的支持,如PHP、Ruby、TypeScript等
  • 代码高亮:添加语法高亮功能,提高代码的可读性
  • 代码保存:支持保存代码片段,方便以后使用
  • 代码分享:支持将代码分享到社交媒体或代码分享平台
  • 代码比较:支持比较不同版本的代码,查看差异
  • 代码分析:添加代码分析功能,检测代码中的问题
  • 自定义格式化规则:允许用户自定义格式化规则,适应个人或团队的代码风格
  • 导出功能:支持将代码导出为不同格式的文件,如PDF、HTML等

7. 代码优化建议

7.1 性能优化

  • 使用 const 构造函数:对于不变的Widget,使用const构造函数,减少不必要的重建
  • 优化状态管理:对于更复杂的应用,可以使用Provider、Riverpod等状态管理库
  • 使用 RepaintBoundary:对于频繁更新的部分,使用RepaintBoundary包裹,减少不必要的重绘
  • 延迟加载:对于非关键信息,可以使用延迟加载,提高应用启动速度

7.2 代码结构优化

  • 组件化:将UI组件拆分为更小的、可复用的组件,如语言选择器、代码输入框、操作按钮等
  • 逻辑分离:将业务逻辑与UI逻辑分离,提高代码的可维护性
  • 参数化:将颜色、字体大小等参数提取为可配置的常量,便于统一管理
  • 错误处理:添加适当的错误处理,提高应用的稳定性

7.3 用户体验优化

  • 添加动画效果:添加主题切换、格式化操作的动画效果,提升用户体验
  • 触觉反馈:在支持的设备上,添加触觉反馈,增强交互体验
  • 无障碍支持:添加无障碍支持,提高应用的可访问性
  • 键盘优化:优化键盘输入体验,支持快捷键操作

7.4 功能优化

  • 添加语法高亮:使用第三方库实现代码语法高亮,提高代码的可读性
  • 支持更多格式化选项:如缩进大小、换行方式等
  • 集成第三方格式化库:使用更专业的代码格式化库,提高格式化效果
  • 添加代码统计:显示代码行数、字符数等统计信息

8. 测试与调试

8.1 测试策略

  • 功能测试:测试语言选择、代码格式化、复制代码、清空代码、主题切换等核心功能
  • 性能测试:测试应用在不同设备上的性能表现
  • 兼容性测试:测试在不同平台、不同屏幕尺寸上的表现
  • 用户体验测试:测试应用的易用性和用户体验

8.2 调试技巧

  • 使用 Flutter DevTools:利用Flutter DevTools分析性能瓶颈和调试问题
  • 添加日志:在关键位置添加日志,便于调试
  • 使用模拟器:在不同尺寸的模拟器上测试,确保适配性
  • 用户测试:邀请用户测试,收集反馈,不断改进

9. 总结与展望

9.1 项目总结

本项目成功实现了一个美观实用的极简代码片段高亮展示与格式化应用,主要功能包括:

  • 支持10种主流编程语言的代码格式化
  • 提供代码高亮展示功能
  • 支持代码复制到剪贴板
  • 支持深色和浅色主题切换
  • 提供简洁美观的用户界面

9.2 技术价值

  • 学习价值:展示了如何使用Flutter实现一个完整的代码格式化工具
  • 实用价值:提供了一个可直接使用的代码格式化工具
  • 参考价值:为类似功能的开发提供了参考方案
  • 教育价值:有助于了解不同编程语言的代码格式规范

9.3 未来展望

  • 添加更多编程语言支持:扩展支持更多编程语言
  • 实现语法高亮:添加代码语法高亮功能
  • 支持代码保存和分享:允许用户保存和分享代码片段
  • 集成第三方格式化库:使用更专业的代码格式化库
  • 添加代码分析功能:检测代码中的问题
  • 支持自定义格式化规则:允许用户自定义格式化规则
  • 导出功能:支持将代码导出为不同格式的文件

10. 附录

10.1 完整代码

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'dart:convert';

void main() {
  SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle(
    statusBarColor: Colors.transparent,
    statusBarIconBrightness: Brightness.dark,
  ));
  runApp(const CodeSnippetApp());
}

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

  
  Widget build(BuildContext context) {
    return MaterialApp(
      title: '极简代码片段高亮展示与格式化',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: const CodeSnippetScreen(),
    );
  }
}

class CodeSnippetScreen extends StatefulWidget {
  const CodeSnippetScreen({Key? key}) : super(key: key);

  
  State<CodeSnippetScreen> createState() => _CodeSnippetScreenState();
}

class _CodeSnippetScreenState extends State<CodeSnippetScreen> {
  String _code = '''void main() {
  print('Hello, World!');
}
''';
  String _language = 'dart';
  bool _isFormatted = false;
  bool _isDarkMode = false;

  final List<String> _languages = [
    'dart',
    'python',
    'java',
    'javascript',
    'cpp',
    'c',
    'csharp',
    'go',
    'rust',
    'swift',
  ];

  void _formatCode() {
    setState(() {
      _code = _formatCodeSnippet(_code, _language);
      _isFormatted = true;
    });
  }

  void _copyCode() {
    Clipboard.setData(ClipboardData(text: _code));
    ScaffoldMessenger.of(context).showSnackBar(
      const SnackBar(content: Text('代码已复制到剪贴板')),
    );
  }

  void _clearCode() {
    setState(() {
      _code = '';
      _isFormatted = false;
    });
  }

  void _toggleDarkMode() {
    setState(() {
      _isDarkMode = !_isDarkMode;
    });
  }

  String _formatCodeSnippet(String code, String language) {
    // 简单的代码格式化实现
    // 在实际应用中,可以使用更复杂的格式化库
    switch (language) {
      case 'dart':
        return _formatDartCode(code);
      case 'python':
        return _formatPythonCode(code);
      case 'java':
        return _formatJavaCode(code);
      case 'javascript':
        return _formatJavaScriptCode(code);
      case 'cpp':
      case 'c':
        return _formatCppCode(code);
      case 'csharp':
        return _formatCSharpCode(code);
      case 'go':
        return _formatGoCode(code);
      case 'rust':
        return _formatRustCode(code);
      case 'swift':
        return _formatSwiftCode(code);
      default:
        return code;
    }
  }

  String _formatDartCode(String code) {
    // 简单的Dart代码格式化
    final lines = code.split('\n');
    final formattedLines = <String>[];
    int indentLevel = 0;
    const indentSize = 2;

    for (final line in lines) {
      final trimmedLine = line.trim();
      if (trimmedLine.isEmpty) {
        formattedLines.add('');
        continue;
      }

      if (trimmedLine.startsWith('}') || trimmedLine.startsWith(')') || trimmedLine.startsWith(']')) {
        indentLevel = (indentLevel - indentSize).clamp(0, indentLevel);
      }

      final indent = ' ' * indentLevel;
      formattedLines.add('$indent$trimmedLine');

      if (trimmedLine.endsWith('{') || trimmedLine.endsWith('(') || trimmedLine.endsWith('[')) {
        indentLevel += indentSize;
      }
    }

    return formattedLines.join('\n');
  }

  String _formatPythonCode(String code) {
    // 简单的Python代码格式化
    final lines = code.split('\n');
    final formattedLines = <String>[];
    int indentLevel = 0;
    const indentSize = 4;

    for (final line in lines) {
      final trimmedLine = line.trim();
      if (trimmedLine.isEmpty) {
        formattedLines.add('');
        continue;
      }

      if (trimmedLine.endsWith(':')) {
        final indent = ' ' * indentLevel;
        formattedLines.add('$indent$trimmedLine');
        indentLevel += indentSize;
      } else {
        // 尝试检测缩进级别
        final currentIndent = line.length - trimmedLine.length;
        if (currentIndent < indentLevel) {
          indentLevel = currentIndent;
        }
        final indent = ' ' * indentLevel;
        formattedLines.add('$indent$trimmedLine');
      }
    }

    return formattedLines.join('\n');
  }

  String _formatJavaCode(String code) {
    // 简单的Java代码格式化
    return _formatCppCode(code); // Java和C++的格式化规则类似
  }

  String _formatJavaScriptCode(String code) {
    // 简单的JavaScript代码格式化
    return _formatCppCode(code); // JavaScript和C++的格式化规则类似
  }

  String _formatCppCode(String code) {
    // 简单的C++代码格式化
    final lines = code.split('\n');
    final formattedLines = <String>[];
    int indentLevel = 0;
    const indentSize = 4;

    for (final line in lines) {
      final trimmedLine = line.trim();
      if (trimmedLine.isEmpty) {
        formattedLines.add('');
        continue;
      }

      if (trimmedLine.startsWith('}') || trimmedLine.startsWith(')') || trimmedLine.startsWith(']')) {
        indentLevel = (indentLevel - indentSize).clamp(0, indentLevel);
      }

      final indent = ' ' * indentLevel;
      formattedLines.add('$indent$trimmedLine');

      if (trimmedLine.endsWith('{') || trimmedLine.endsWith('(') || trimmedLine.endsWith('[')) {
        indentLevel += indentSize;
      }
    }

    return formattedLines.join('\n');
  }

  String _formatCSharpCode(String code) {
    // 简单的C#代码格式化
    return _formatCppCode(code); // C#和C++的格式化规则类似
  }

  String _formatGoCode(String code) {
    // 简单的Go代码格式化
    final lines = code.split('\n');
    final formattedLines = <String>[];
    int indentLevel = 0;
    const indentSize = 4;

    for (final line in lines) {
      final trimmedLine = line.trim();
      if (trimmedLine.isEmpty) {
        formattedLines.add('');
        continue;
      }

      if (trimmedLine.startsWith('}') || trimmedLine.startsWith(')') || trimmedLine.startsWith(']')) {
        indentLevel = (indentLevel - indentSize).clamp(0, indentLevel);
      }

      final indent = ' ' * indentLevel;
      formattedLines.add('$indent$trimmedLine');

      if (trimmedLine.endsWith('{') || trimmedLine.endsWith('(') || trimmedLine.endsWith('[')) {
        indentLevel += indentSize;
      }
    }

    return formattedLines.join('\n');
  }

  String _formatRustCode(String code) {
    // 简单的Rust代码格式化
    final lines = code.split('\n');
    final formattedLines = <String>[];
    int indentLevel = 0;
    const indentSize = 4;

    for (final line in lines) {
      final trimmedLine = line.trim();
      if (trimmedLine.isEmpty) {
        formattedLines.add('');
        continue;
      }

      if (trimmedLine.startsWith('}') || trimmedLine.startsWith(')') || trimmedLine.startsWith(']')) {
        indentLevel = (indentLevel - indentSize).clamp(0, indentLevel);
      }

      final indent = ' ' * indentLevel;
      formattedLines.add('$indent$trimmedLine');

      if (trimmedLine.endsWith('{') || trimmedLine.endsWith('(') || trimmedLine.endsWith('[')) {
        indentLevel += indentSize;
      }
    }

    return formattedLines.join('\n');
  }

  String _formatSwiftCode(String code) {
    // 简单的Swift代码格式化
    final lines = code.split('\n');
    final formattedLines = <String>[];
    int indentLevel = 0;
    const indentSize = 4;

    for (final line in lines) {
      final trimmedLine = line.trim();
      if (trimmedLine.isEmpty) {
        formattedLines.add('');
        continue;
      }

      if (trimmedLine.startsWith('}') || trimmedLine.startsWith(')') || trimmedLine.startsWith(']')) {
        indentLevel = (indentLevel - indentSize).clamp(0, indentLevel);
      }

      final indent = ' ' * indentLevel;
      formattedLines.add('$indent$trimmedLine');

      if (trimmedLine.endsWith('{') || trimmedLine.endsWith('(') || trimmedLine.endsWith('[')) {
        indentLevel += indentSize;
      }
    }

    return formattedLines.join('\n');
  }

  
  Widget build(BuildContext context) {
    final theme = _isDarkMode ? ThemeData.dark() : ThemeData.light();

    return Theme(
      data: theme,
      child: Scaffold(
        appBar: AppBar(
          title: const Text('极简代码片段高亮展示与格式化'),
          backgroundColor: theme.primaryColor,
          actions: [
            IconButton(
              onPressed: _toggleDarkMode,
              icon: Icon(_isDarkMode ? Icons.light_mode : Icons.dark_mode),
            ),
          ],
        ),
        body: Container(
          decoration: BoxDecoration(
            gradient: LinearGradient(
              begin: Alignment.topCenter,
              end: Alignment.bottomCenter,
              colors: _isDarkMode
                  ? [Colors.grey.shade900, Colors.black]
                  : [Colors.blue.shade50, Colors.white],
            ),
          ),
          child: SingleChildScrollView(
            padding: const EdgeInsets.all(24),
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: [
                // 语言选择
                Container(
                  margin: const EdgeInsets.only(bottom: 16),
                  child: Column(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: [
                      Text(
                        '选择语言',
                        style: TextStyle(
                          fontSize: 16,
                          fontWeight: FontWeight.bold,
                          color: theme.textTheme.bodyLarge?.color,
                        ),
                      ),
                      const SizedBox(height: 8),
                      DropdownButtonFormField<String>(
                        value: _language,
                        onChanged: (value) {
                          setState(() {
                            _language = value!;
                          });
                        },
                        items: _languages.map((language) {
                          return DropdownMenuItem<String>(
                            value: language,
                            child: Text(language),
                          );
                        }).toList(),
                        decoration: InputDecoration(
                          border: OutlineInputBorder(
                            borderRadius: BorderRadius.circular(8),
                          ),
                          filled: true,
                          fillColor: theme.cardColor,
                        ),
                      ),
                    ],
                  ),
                ),

                // 代码输入
                Container(
                  margin: const EdgeInsets.only(bottom: 16),
                  child: Column(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: [
                      Text(
                        '输入代码',
                        style: TextStyle(
                          fontSize: 16,
                          fontWeight: FontWeight.bold,
                          color: theme.textTheme.bodyLarge?.color,
                        ),
                      ),
                      const SizedBox(height: 8),
                      Container(
                        decoration: BoxDecoration(
                          color: _isDarkMode ? Colors.grey.shade800 : Colors.grey.shade100,
                          borderRadius: BorderRadius.circular(8),
                          border: Border.all(
                            color: theme.dividerColor,
                          ),
                        ),
                        child: TextField(
                          onChanged: (value) {
                            setState(() {
                              _code = value;
                              _isFormatted = false;
                            });
                          },
                          controller: TextEditingController(text: _code),
                          decoration: const InputDecoration(
                            border: InputBorder.none,
                            contentPadding: EdgeInsets.all(16),
                          ),
                          style: TextStyle(
                            fontFamily: 'Courier New',
                            fontSize: 14,
                            color: theme.textTheme.bodyLarge?.color,
                          ),
                          maxLines: 15,
                          keyboardType: TextInputType.multiline,
                        ),
                      ),
                    ],
                  ),
                ),

                // 操作按钮
                Container(
                  margin: const EdgeInsets.only(bottom: 16),
                  child: Row(
                    children: [
                      Expanded(
                        child: ElevatedButton(
                          onPressed: _formatCode,
                          style: ElevatedButton.styleFrom(
                            backgroundColor: theme.primaryColor,
                            foregroundColor: theme.primaryTextTheme.bodyLarge?.color,
                            padding: const EdgeInsets.symmetric(vertical: 12),
                            shape: RoundedRectangleBorder(
                              borderRadius: BorderRadius.circular(8),
                            ),
                          ),
                          child: const Text('格式化代码'),
                        ),
                      ),
                      const SizedBox(width: 12),
                      Expanded(
                        child: ElevatedButton(
                          onPressed: _copyCode,
                          style: ElevatedButton.styleFrom(
                            backgroundColor: theme.primaryColor,
                            foregroundColor: theme.primaryTextTheme.bodyLarge?.color,
                            padding: const EdgeInsets.symmetric(vertical: 12),
                            shape: RoundedRectangleBorder(
                              borderRadius: BorderRadius.circular(8),
                            ),
                          ),
                          child: const Text('复制代码'),
                        ),
                      ),
                      const SizedBox(width: 12),
                      Expanded(
                        child: ElevatedButton(
                          onPressed: _clearCode,
                          style: ElevatedButton.styleFrom(
                            backgroundColor: theme.colorScheme.error,
                            foregroundColor: theme.colorScheme.onError,
                            padding: const EdgeInsets.symmetric(vertical: 12),
                            shape: RoundedRectangleBorder(
                              borderRadius: BorderRadius.circular(8),
                            ),
                          ),
                          child: const Text('清空代码'),
                        ),
                      ),
                    ],
                  ),
                ),

                // 代码预览
                Container(
                  margin: const EdgeInsets.only(bottom: 16),
                  child: Column(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: [
                      Text(
                        '代码预览',
                        style: TextStyle(
                          fontSize: 16,
                          fontWeight: FontWeight.bold,
                          color: theme.textTheme.bodyLarge?.color,
                        ),
                      ),
                      const SizedBox(height: 8),
                      Container(
                        decoration: BoxDecoration(
                          color: _isDarkMode ? Colors.grey.shade800 : Colors.grey.shade100,
                          borderRadius: BorderRadius.circular(8),
                          border: Border.all(
                            color: theme.dividerColor,
                          ),
                        ),
                        padding: const EdgeInsets.all(16),
                        child: SelectableText(
                          _code,
                          style: TextStyle(
                            fontFamily: 'Courier New',
                            fontSize: 14,
                            color: theme.textTheme.bodyLarge?.color,
                          ),
                          showCursor: true,
                          cursorColor: theme.primaryColor,
                        ),
                      ),
                    ],
                  ),
                ),

                // 状态信息
                if (_isFormatted)
                  Container(
                    margin: const EdgeInsets.only(bottom: 16),
                    padding: const EdgeInsets.all(12),
                    decoration: BoxDecoration(
                      color: _isDarkMode ? Colors.green.shade900 : Colors.green.shade100,
                      borderRadius: BorderRadius.circular(8),
                      border: Border.all(
                        color: _isDarkMode ? Colors.green.shade700 : Colors.green.shade300,
                      ),
                    ),
                    child: Row(
                      children: [
                        Icon(
                          Icons.check_circle,
                          color: _isDarkMode ? Colors.green.shade400 : Colors.green.shade700,
                        ),
                        const SizedBox(width: 8),
                        Text(
                          '代码已格式化',
                          style: TextStyle(
                            color: _isDarkMode ? Colors.green.shade400 : Colors.green.shade700,
                          ),
                        ),
                      ],
                    ),
                  ),

                // 应用说明
                Container(
                  padding: const EdgeInsets.all(16),
                  decoration: BoxDecoration(
                    color: theme.cardColor,
                    borderRadius: BorderRadius.circular(12),
                    boxShadow: [
                      BoxShadow(
                        color: Colors.grey.withOpacity(0.2),
                        spreadRadius: 2,
                        blurRadius: 4,
                        offset: const Offset(0, 2),
                      ),
                    ],
                  ),
                  child: Column(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: [
                      Text(
                        '应用说明',
                        style: TextStyle(
                          fontSize: 16,
                          fontWeight: FontWeight.bold,
                          color: theme.textTheme.bodyLarge?.color,
                        ),
                      ),
                      const SizedBox(height: 8),
                      Text(
                        '1. 选择编程语言',
                        style: TextStyle(
                          fontSize: 14,
                          color: theme.textTheme.bodyLarge?.color,
                        ),
                      ),
                      const SizedBox(height: 4),
                      Text(
                        '2. 在输入框中输入代码',
                        style: TextStyle(
                          fontSize: 14,
                          color: theme.textTheme.bodyLarge?.color,
                        ),
                      ),
                      const SizedBox(height: 4),
                      Text(
                        '3. 点击"格式化代码"按钮格式化代码',
                        style: TextStyle(
                          fontSize: 14,
                          color: theme.textTheme.bodyLarge?.color,
                        ),
                      ),
                      const SizedBox(height: 4),
                      Text(
                        '4. 点击"复制代码"按钮将代码复制到剪贴板',
                        style: TextStyle(
                          fontSize: 14,
                          color: theme.textTheme.bodyLarge?.color,
                        ),
                      ),
                      const SizedBox(height: 4),
                      Text(
                        '5. 点击"清空代码"按钮清空输入框',
                        style: TextStyle(
                          fontSize: 14,
                          color: theme.textTheme.bodyLarge?.color,
                        ),
                      ),
                      const SizedBox(height: 4),
                      Text(
                        '6. 点击右上角的图标切换深色/浅色模式',
                        style: TextStyle(
                          fontSize: 14,
                          color: theme.textTheme.bodyLarge?.color,
                        ),
                      ),
                    ],
                  ),
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}

10.2 依赖项

  • flutter:Flutter 框架
  • flutter/services.dart:提供 Clipboard 类,用于复制代码到剪贴板
  • dart:convert:提供 JSON 编码和解码功能(虽然在本应用中未使用,但保留作为代码结构参考)

10.3 运行环境

  • Flutter SDK:3.0.0 或更高版本
  • Dart SDK:2.17.0 或更高版本
  • 支持的平台:Android、iOS、Web、Windows、macOS、Linux

10.4 参考资源

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐