1
1
import 'dart:async' ; // TimeoutExceptionのために追加
2
2
import 'dart:convert' ;
3
+ import 'dart:io' ;
4
+ import 'package:path_provider/path_provider.dart' ;
3
5
import 'package:flutter/material.dart' ;
4
6
import 'package:flutter/services.dart' ; // Clipboardのために追加
5
7
import 'package:share_plus/share_plus.dart' ; // コード共有用
@@ -14,7 +16,6 @@ import 'package:flutter_highlight/themes/monokai-sublime.dart';
14
16
import 'package:flutter_highlight/themes/github.dart' ;
15
17
import 'package:google_fonts/google_fonts.dart' ;
16
18
import 'package:http/http.dart' as http; // HTTPリクエスト用
17
- import 'package:shared_preferences/shared_preferences.dart' ;
18
19
import '../models/problem.dart' ;
19
20
import '../models/test_result.dart' ;
20
21
import '../services/atcoder_service.dart' ;
@@ -78,16 +79,49 @@ class _EditorScreenState extends State<EditorScreen> {
78
79
super .dispose ();
79
80
}
80
81
82
+ Future <String > _getFilePath () async {
83
+ if (_currentProblem == null ) {
84
+ // 問題がロードされていない場合はデフォルトのパスを返す
85
+ return '' ;
86
+ }
87
+ final directory = await getApplicationDocumentsDirectory ();
88
+ final contestId = _currentProblem! .contestId;
89
+ // 問題タイトルからファイル名として不適切な文字を削除・置換
90
+ final problemTitle = _currentProblem! .title.replaceAll (RegExp (r'[\\/:*?"<>|]' ), '_' );
91
+ final extension = _getExtension (_selectedLanguage);
92
+ final path = '${directory .path }/$contestId /$problemTitle /main.$extension ' ;
93
+ return path;
94
+ }
95
+
96
+ String _getExtension (String language) {
97
+ switch (language) {
98
+ case 'Python' :
99
+ return 'py' ;
100
+ case 'C++' :
101
+ return 'cpp' ;
102
+ case 'Rust' :
103
+ return 'rs' ;
104
+ case 'Java' :
105
+ return 'java' ;
106
+ default :
107
+ return 'txt' ;
108
+ }
109
+ }
110
+
81
111
// 保存されたコードを読み込む関数
82
112
Future <void > _loadSavedCode () async {
83
113
setState (() {
84
114
_isLoadingCode = true ;
85
115
});
86
116
try {
87
- final prefs = await SharedPreferences .getInstance ();
88
- final savedCode = prefs.getString ('code_${widget .problemId }_$_selectedLanguage ' );
89
- // ★★★ ここで _codeController にアクセスする前に初期化されている必要がある ★★★
90
- if (savedCode != null ) {
117
+ final filePath = await _getFilePath ();
118
+ if (filePath.isEmpty) {
119
+ _codeController.text = _getTemplateForLanguage (_selectedLanguage);
120
+ return ;
121
+ }
122
+ final file = File (filePath);
123
+ if (await file.exists ()) {
124
+ final savedCode = await file.readAsString ();
91
125
_codeController.text = savedCode;
92
126
} else {
93
127
_codeController.text = _getTemplateForLanguage (_selectedLanguage);
@@ -106,10 +140,19 @@ class _EditorScreenState extends State<EditorScreen> {
106
140
// 現在のコードを保存する関数
107
141
Future <void > _saveCode () async {
108
142
try {
109
- final prefs = await SharedPreferences .getInstance ();
110
- await prefs.setString ('code_${widget .problemId }_$_selectedLanguage ' , _codeController.text);
143
+ final filePath = await _getFilePath ();
144
+ if (filePath.isEmpty) {
145
+ ScaffoldMessenger .of (context).showSnackBar (
146
+ const SnackBar (content: Text ('問題がロードされていないため保存できません' )),
147
+ );
148
+ return ;
149
+ }
150
+ final file = File (filePath);
151
+ // ディレクトリが存在しない場合は作成
152
+ await file.parent.create (recursive: true );
153
+ await file.writeAsString (_codeController.text);
111
154
ScaffoldMessenger .of (context).showSnackBar (
112
- SnackBar (content: Text ('$ _selectedLanguage のコードを保存しました ' )),
155
+ SnackBar (content: Text ('コードを $ filePath に保存しました ' )),
113
156
);
114
157
} catch (e) {
115
158
ScaffoldMessenger .of (context).showSnackBar (
@@ -263,9 +306,16 @@ public class Main {
263
306
// 現在のコードを復元する関数
264
307
Future <void > _restoreCode () async {
265
308
try {
266
- final prefs = await SharedPreferences .getInstance ();
267
- final savedCode = prefs.getString ('code_${widget .problemId }_$_selectedLanguage ' );
268
- if (savedCode != null ) {
309
+ final filePath = await _getFilePath ();
310
+ if (filePath.isEmpty) {
311
+ ScaffoldMessenger .of (context).showSnackBar (
312
+ const SnackBar (content: Text ('問題がロードされていないため復元できません' )),
313
+ );
314
+ return ;
315
+ }
316
+ final file = File (filePath);
317
+ if (await file.exists ()) {
318
+ final savedCode = await file.readAsString ();
269
319
setState (() {
270
320
_codeController.text = savedCode;
271
321
});
0 commit comments