import re filepath = r'C:\Users\jsmbz\Documents\flutter-app-02\lib\features\home\presentation\widgets\map\testmap_pages.dart' with open(filepath, 'r', encoding='utf-8') as f: content = f.read() # Pattern: find the second duplicate method (with debugPrint in catch) # It starts with "/// 从 state.pathData 实时解析" and ends with "}\n\n Widget _buildWorkPanel" pattern1 = r'\n /// 从 state\.pathData 实时解析 startWorkList\n /// 解决 BlocBuilder 因 state\.pathData 变化触发重建时,onTap 的异步赋值还未完成的时序问题\n List _parseStartWorkListFromPathData\(List>\? pathData\) \{\n if \(pathData == null \|\| pathData\.isEmpty\) return \[\];\n final firstRecord = pathData\.first;\n final nestedJsonRaw = firstRecord\['jsonData'\];\n if \(nestedJsonRaw is! String\) return \[\];\n try \{\n final parsedJson = jsonDecode\(nestedJsonRaw\);\n if \(parsedJson is! Map\) return \[\];\n final planModel = parsedJson\['planModel'\];\n final isBow = planModel == WorkMode\.bow\.value;\n\n List pathList = \[\];\n final rawPath = parsedJson\['path'\];\n if \(rawPath is String\) \{\n try \{ pathList = jsonDecode\(rawPath\) as List; \} catch \(_\) \{\}\n \} else if \(rawPath is List\) \{\n pathList = rawPath;\n \}\n\n List outerList = \[\];\n final rawOuter = parsedJson\['outer'\];\n if \(rawOuter is String\) \{\n try \{ outerList = jsonDecode\(rawOuter\) as List; \} catch \(_\) \{\}\n \} else if \(rawOuter is List\) \{\n outerList = rawOuter;\n \}\n\n if \(isBow\) \{\n return pathList\.isNotEmpty \? pathList : outerList;\n \} else \{\n return outerList\.isNotEmpty \? outerList : pathList;\n \}\n \} catch \(e\) \{\n debugPrint\('❌ \[_parseStartWorkListFromPathData\] 解析失败: \$e'\);\n return \[\];\n \}\n \}\n\n Widget _buildWorkPanel' # Try to find and replace the second duplicate method match = re.search(pattern1, content) if match: print(f"Found duplicate method at position {match.start()}-{match.end()}") content = content[:match.start()] + '\n Widget _buildWorkPanel' + content[match.end():] else: print("Pattern 1 not found, trying simpler approach...") # Just find the second occurrence of _parseStartWorkListFromPathData first_idx = content.find('_parseStartWorkListFromPathData') second_idx = content.find('_parseStartWorkListFromPathData', first_idx + 1) if second_idx != -1: # Find the start of this method (go back to find " ///" or " List") start = content.rfind(' /// 从 state.pathData', 0, second_idx) if start == -1: start = content.rfind(' List _parseStartWorkListFromPathData', 0, second_idx) # Find the end of this method end = content.find(' Widget _buildWorkPanel', second_idx) if end == -1: end = content.find('Widget _buildWorkPanel', second_idx) if start != -1 and end != -1: print(f"Found duplicate at {start}-{end}") content = content[:start] + content[end:] else: print(f"Could not find boundaries: start={start}, end={end}") else: print("No duplicate method found") # Pattern 2: remove duplicate call in _buildWorkPanel # Find the second "// 核心修复:" inside _buildWorkPanel builder first_core = content.find('// 🔥 核心修复:从 state.pathData 实时计算 startWorkList') second_core = content.find('// 核心修复:从 state.pathData 实时计算 startWorkList', first_core + 1) if second_core != -1: # Go back to find the blank line before this duplicate block start_call = content.rfind('\n', 0, second_core) start_call = content.rfind('\n', 0, start_call) # go back one more line # Find the end after the duplicate block # The block is: "// 核心修复...\n final parsedList...\n if...\n startWorkList...\n }\n" end_call = content.find('\n return Positioned(', second_core) if end_call != -1: print(f"Found duplicate call at {start_call}-{end_call}") content = content[:start_call] + content[end_call:] else: print(f"Could not find end of duplicate call") else: print("No duplicate call found") with open(filepath, 'w', encoding='utf-8') as f: f.write(content) print("Done!")