剪貼板APP

Code

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

void main() {
runApp(const ClipboardApp());
}

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

@override
_ClipboardAppState createState() => _ClipboardAppState();
}

class _ClipboardAppState extends State<ClipboardApp> {
List<String> clipboardContents = [];

@override
void initState() {
    super.initState();
    initClipboard();
}

Future<void> initClipboard() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    clipboardContents = prefs.getStringList('clipboardContents') ?? [];
    setState(() {});
}

Future<void> copyToClipboard() async {
    ClipboardData? clipboardData = await Clipboard.getData('text/plain');
    if (clipboardData != null) {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    clipboardContents.add(clipboardData.text!);
    prefs.setStringList('clipboardContents', clipboardContents);
    setState(() {});
    }
}

@override
Widget build(BuildContext context) {
    return MaterialApp(
    debugShowCheckedModeBanner: false,
    home: Scaffold(
        body: Center(
        child: ListView.builder(
            padding: const EdgeInsets.all(8),
            itemCount: clipboardContents.length,
            itemBuilder: (BuildContext context, int index) {
            return ListTile(
                leading: IconButton(
                icon: Icon(Icons.copy),
                onPressed: () async {
                    await Clipboard.setData(
                        ClipboardData(text: clipboardContents[index]));
                },
                ),
                title: Text(
                '${clipboardContents[index]}',
                maxLines: 2,
                overflow: TextOverflow.ellipsis,
                ),
                trailing: IconButton(
                icon: Icon(Icons.delete),
                onPressed: () async {
                    SharedPreferences prefs =
                        await SharedPreferences.getInstance();
                    clipboardContents.removeAt(index);
                    prefs.setStringList('clipboardContents', clipboardContents);
                    setState(() {});
                },
                ),
            );
            },
        ),
        ),
        floatingActionButton: FloatingActionButton(
        onPressed: copyToClipboard,
        child: Icon(Icons.add),
        ),
    ),
    );
}
}

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

void main() {
runApp(const ClipboardApp());
}

此行導入了Flutter框架中的一些核心庫,以及一些用於處理系統服務的庫,如剪貼板和共享首選項。

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

@override
_ClipboardAppState createState() => _ClipboardAppState();
}

這是一個繼承自StatefulWidget的自定義小部件ClipboardApp,用於創建應用程序的主要小部件。

class _ClipboardAppState extends State<ClipboardApp> {
List<String> clipboardContents = [];

@override
void initState() {
    super.initState();
    initClipboard();
}

Future<void> initClipboard() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    clipboardContents = prefs.getStringList('clipboardContents') ?? [];
    setState(() {});
}

_ClipboardAppState是ClipboardApp的狀態類。在這個類中,我們初始化了一個空的字符串列表clipboardContents,並重寫了initState方法,在小部件初始化時調用initClipboard方法。initClipboard方法從SharedPreferences中獲取之前存儲的剪貼板內容並更新狀態。

Future<void> copyToClipboard() async {
    ClipboardData? clipboardData = await Clipboard.getData('text/plain');
    if (clipboardData != null) {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    clipboardContents.add(clipboardData.text!);
    prefs.setStringList('clipboardContents', clipboardContents);
    setState(() {});
    }
}

copyToClipboard方法用於將剪貼板中的內容添加到列表中並保存到SharedPreferences中。它使用了async/await機制來處理異步操作。

@override
Widget build(BuildContext context) {
    return MaterialApp(
    debugShowCheckedModeBanner: false,
    home: Scaffold(
        body: Center(
        child: ListView.builder(
            padding: const EdgeInsets.all(8),
            itemCount: clipboardContents.length,
            itemBuilder: (BuildContext context, int index) {
            return ListTile(
                leading: IconButton(
                icon: Icon(Icons.copy),
                onPressed: () async {
                    await Clipboard.setData(
                        ClipboardData(text: clipboardContents[index]));
                },
                ),
                title: Text(
                '${clipboardContents[index]}',
                maxLines: 2,
                overflow: TextOverflow.ellipsis,
                ),
                trailing: IconButton(
                icon: Icon(Icons.delete),
                onPressed: () async {
                    SharedPreferences prefs =
                        await SharedPreferences.getInstance();
                    clipboardContents.removeAt(index);
                    prefs.setStringList('clipboardContents', clipboardContents);
                    setState(() {});
                },
                ),
            );
            },
        ),
        ),
        floatingActionButton: FloatingActionButton(
        onPressed: copyToClipboard,
        child: Icon(Icons.add),
        ),
    ),
    );
}
}

build方法構建了應用程序的UI。它返回一個MaterialApp,其中包含一個Scaffold,其主體是一個居中的ListView.builder,用於顯示剪貼板內容列表。每個列表項都包含兩個圖標按鈕:一個用於復制到剪貼板,另一個用於刪除該內容。floatingActionButton用於觸發copyToClipboard方法,該方法將剪貼板中的內容添加到列表中。setState用於更新UI以反映數據更改。


Last update : 13 novembre 2024
Created : 13 novembre 2024

Comments

Comments