Flutter 常見錯誤和坑

1. 狀態管理問題

StatefulWidget 生命周期誤用

// 錯誤:在 build 方法中修改狀態
@override
Widget build(BuildContext context) {setState(() { counter++; }); // 會導致無限重建循環return Text('$counter');
}// 正確:在事件處理中修改狀態
Widget build(BuildContext context) {return ElevatedButton(onPressed: () => setState(() { counter++; }),child: Text('$counter'),);
}

狀態管理濫用

  • :為每個小組件創建 StatefulWidget
  • 解決方案:使用 Provider、Riverpod、Bloc 等狀態管理庫集中管理狀態

2. 布局與渲染問題

無限高度/寬度錯誤

// 錯誤:在 ListView 中使用無約束的 Column
ListView(children: [Column(children: [...], // 這會導致 "Vertical viewport was given unbounded height" 錯誤)],
)// 正確:使用 shrinkWrap 或限制 Column 高度
ListView(children: [Column(mainAxisSize: MainAxisSize.min, // 限制高度為內容所需高度children: [...],)],
)

嵌套 SingleChildScrollView

  • :在一個 SingleChildScrollView 內部嵌套另一個,導致滾動沖突
  • 解決方案:使用 NeverScrollableScrollPhysics 或 CustomScrollView 與 Slivers

BoxConstraints 約束沖突

  • :設置無法滿足的約束條件,如固定高度內放置無限內容
  • 解決方案:使用 LayoutBuilder 了解可用約束,或使用 Expanded/Flexible 組件

3. 異步和性能問題

主線程阻塞

// 錯誤:在主線程執行耗時操作
onPressed: () {// 直接處理大量數據,會凍結UIprocessMassiveData();
}// 正確:使用異步或 Isolate
onPressed: () async {// 使用 compute 函數在單獨的 isolate 中處理final result = await compute(processMassiveData, inputData);
}

FutureBuilder/StreamBuilder 錯誤使用

// 錯誤:未處理初始和錯誤狀態
FutureBuilder<String>(future: fetchData(),builder: (context, snapshot) {return Text(snapshot.data!); // 可能引發空值錯誤},
)// 正確:處理所有可能的狀態
FutureBuilder<String>(future: fetchData(),builder: (context, snapshot) {if (snapshot.connectionState == ConnectionState.waiting) {return CircularProgressIndicator();}if (snapshot.hasError) {return Text('Error: ${snapshot.error}');}return Text(snapshot.data ?? 'No data');},
)

4. 圖片和資源問題

圖片緩存溢出

  • :加載大量圖片但不釋放內存
  • 解決方案:使用 CachedNetworkImage 庫,并設置合理的緩存策略

資源引用錯誤

# 錯誤:pubspec.yaml 資源路徑配置不正確
flutter:assets:- assets/images # 這樣寫不會包含子目錄# 正確:
flutter:assets:- assets/images/ # 使用斜杠表示目錄- assets/images/icons/ # 子目錄需單獨列出

5. 導航和路由問題

導航狀態丟失

  • :使用 Navigator.pushReplacement 后無法返回上一頁
  • 解決方案:使用 Navigator.pushAndRemoveUntil 時保留部分路由歷史

頁面重建問題

// 錯誤:每次構建時創建新的導航目標
onPressed: () {Navigator.push(context,MaterialPageRoute(builder: (context) => DetailsPage()),);
}// 更好:使用命名路由或預先定義路由
onPressed: () {Navigator.pushNamed(context, '/details');
}

6. 插件和平臺集成問題

權限處理不當

  • :未正確處理 Android/iOS 權限導致應用崩潰
  • 解決方案:使用 permission_handler 庫正確請求和檢查權限

平臺特定代碼錯誤

// 錯誤:未檢查平臺就調用平臺特定代碼
final directory = await getExternalStorageDirectory(); // iOS 上不可用// 正確:檢查平臺
final directory = Platform.isAndroid ? await getExternalStorageDirectory(): await getApplicationDocumentsDirectory();

7. Flutter 版本和兼容性問題

依賴沖突

  • :插件之間的版本依賴沖突
  • 解決方案:使用 dependency_overrides 或減少使用有沖突的插件

Flutter 升級后的 breaking changes

  • :升級 Flutter 版本后代碼不兼容
  • 解決方案:認真閱讀更新日志,使用 flutter fix 命令自動修復部分問題

8. Widget 重建優化問題

過度重建

// 錯誤:const 構造函數未使用導致不必要的重建
Widget build(BuildContext context) {return Row(children: [Icon(Icons.star), // 每次都會重建Text('Rating'),],);
}// 正確:使用 const 構造函數
Widget build(BuildContext context) {return Row(children: [const Icon(Icons.star), // 只構建一次const Text('Rating'),],);
}

BuildContext 超出范圍使用

// 錯誤:異步操作后使用已經不存在的 context
onPressed: () async {await Future.delayed(Duration(seconds: 1));showDialog(context: context, builder: (_) => AlertDialog()); // context 可能已經被銷毀
}// 正確:捕獲 context 或檢查掛載狀態
onPressed: () async {final currentContext = context;await Future.delayed(Duration(seconds: 1));if (mounted) {showDialog(context: currentContext, builder: (_) => AlertDialog());}
}

9. 熱重載/熱重啟陷阱

狀態未重置

  • :熱重載不會重置應用狀態,導致測試困難
  • 解決方案:進行完整的熱重啟(Hot Restart)或使用 StatefulWidget 的 reassemble 方法

原生插件變更

  • :原生插件代碼變更后熱重載不生效
  • 解決方案:完整重新構建應用

10. Flutter Web 特定問題

移動優先設計導致的 Web 適配問題

  • :默認的移動設計在 Web 上表現不佳
  • 解決方案:使用 LayoutBuilder 或 MediaQuery 創建響應式設計

JavaScript 互操作性問題

  • :JS 互操作帶來的性能和兼容性問題
  • 解決方案:盡量減少 JS 互操作,或使用 Flutter 原生實現

最佳實踐建議

  1. 使用靜態分析工具:啟用并遵循 Flutter Lint 規則

    # analysis_options.yaml
    include: package:flutter_lints/flutter.yaml
    
  2. 定期更新依賴:使用 flutter pub outdatedflutter pub upgrade 保持依賴更新

  3. 選擇合適的狀態管理方案:根據項目規模選擇合適的狀態管理庫

  4. 編寫測試:單元測試、組件測試和集成測試可以避免很多常見錯誤

  5. 優化構建性能:使用 Flutter DevTools 分析并優化性能瓶頸

  6. 使用 Key:在動態列表和重構布局時使用 Key 避免狀態混亂

    ListView.builder(itemBuilder: (context, index) {return ListTile(key: ValueKey(items[index].id), // 使用唯一鍵title: Text(items[index].title),);},
    )
    
  7. 遵循 Flutter 代碼風格:使用推薦的代碼風格和命名約定

  8. 謹慎使用 GlobalKey:避免不必要的 GlobalKey 使用,會帶來性能負擔

通過了解這些常見問題和解決方案,你可以避免在 Flutter 開發中陷入這些"坑",提高開發效率和應用質量。

11. 表單驗證與處理問題

表單驗證不當

// 錯誤:手動實現復雜的表單驗證邏輯
TextField(onChanged: (value) {if (value.isEmpty) {setState(() => error = 'Field cannot be empty');} else {setState(() => error = null);}},
)// 正確:使用 Form 和 FormField
Form(key: _formKey,child: TextFormField(validator: (value) {if (value == null || value.isEmpty) {return 'Field cannot be empty';}return null;},// 統一驗證// _formKey.currentState!.validate();),
)

鍵盤處理問題

  • :鍵盤遮擋輸入框
  • 解決方案:使用 SingleChildScrollView 配合 resizeToAvoidBottomInsetScaffold.resizeToAvoidBottomInset = true

焦點管理不當

// 錯誤:焦點切換邏輯混亂
TextField(onSubmitted: (_) {FocusScope.of(context).nextFocus(); // 可能找不到下一個焦點},
)// 正確:使用 FocusNode 精確控制
final _focus1 = FocusNode();
final _focus2 = FocusNode();TextField(focusNode: _focus1,onSubmitted: (_) {FocusScope.of(context).requestFocus(_focus2);},
)

12. 動畫和過渡效果問題

資源泄漏

// 錯誤:未正確釋放動畫控制器
class _MyAnimationState extends State<MyAnimation> with SingleTickerProviderStateMixin {late AnimationController _controller;@overridevoid initState() {super.initState();_controller = AnimationController(vsync: this, duration: Duration(seconds: 1));_controller.forward();}// 忘記釋放動畫控制器會導致內存泄漏
}// 正確:在 dispose 中釋放資源
@override
void dispose() {_controller.dispose();super.dispose();
}

動畫性能問題

  • :在每一幀重建過多組件
  • 解決方案:使用 AnimatedBuilder 來隔離動畫驅動的部分,避免整個組件樹重建
// 錯誤:整個組件樹隨動畫重建
@override
Widget build(BuildContext context) {return Transform.rotate(angle: _animation.value,child: Container(// 復雜的組件樹,每一幀都會重建),);
}// 正確:只重建必要的部分
@override
Widget build(BuildContext context) {return AnimatedBuilder(animation: _animation,builder: (context, child) {return Transform.rotate(angle: _animation.value,child: child, // 子組件不會重建);},child: Container(// 只構建一次,不會隨動畫重建),);
}

13. 本地化和國際化問題

硬編碼文本

// 錯誤:直接硬編碼文本
Text('Welcome to the app')// 正確:使用本地化庫
Text(AppLocalizations.of(context)!.welcome)

日期和數字格式化問題

  • :不同地區的日期、數字格式差異
  • 解決方案:使用 intl 包進行本地化格式化
// 錯誤:硬編碼日期格式
Text('${date.day}/${date.month}/${date.year}')// 正確:使用本地化格式
import 'package:intl/intl.dart';
Text(DateFormat.yMd(Localizations.localeOf(context).languageCode).format(date))

14. 調試和錯誤處理

缺少全局錯誤處理

// 錯誤:沒有全局錯誤捕獲
void main() {runApp(MyApp());
}// 正確:設置全局錯誤處理
void main() {FlutterError.onError = (FlutterErrorDetails details) {// 記錄錯誤到日志服務print('Flutter error: ${details.exception}');// 可以根據環境決定是否重新拋出};runApp(MyApp());
}

print 調試濫用

  • :生產環境中留下過多 print 語句
  • 解決方案:使用可配置的日志庫如 loggerlogging
// 更好的做法:使用結構化日志
import 'package:logger/logger.dart';final logger = Logger(printer: PrettyPrinter(methodCount: 0),
);// 開發環境記錄詳細日志,生產環境可調整級別
logger.d('Debug info');
logger.i('Important info');
logger.e('Error occurred', error, stackTrace);

15. 代碼組織和架構問題

架構混亂

  • :將業務邏輯、UI和數據訪問混在一起
  • 解決方案:采用清晰的架構模式如 MVVM、Clean Architecture 或 BLoC

組件復用不足

// 錯誤:復制粘貼相似的UI代碼
class Screen1 extends StatelessWidget {@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('Screen 1')),body: ListView(children: [// 復雜的自定義列表項],),);}
}// 正確:提取可復用組件
class CustomListItem extends StatelessWidget {final String title;final IconData icon;const CustomListItem({required this.title, required this.icon});@overrideWidget build(BuildContext context) {// 可復用的列表項實現}
}

16. 項目依賴與打包問題

過大的應用包體積

  • :應用體積過大,影響用戶下載和安裝體驗
  • 解決方案
    • 使用 flutter build apk --split-per-abi 為不同 CPU 架構創建不同的安裝包
    • 使用 Android App Bundle (AAB) 格式以減小安裝包大小
    • 優化圖像資源,避免包含過多高分辨率圖像

針對特定平臺的打包問題

// 錯誤:忽略平臺特定配置
dependencies:some_package: ^1.0.0  // 可能帶來不必要的平臺依賴// 正確:根據平臺導入依賴
dependencies:some_package:android: ^1.0.0ios: ^1.0.0web: ^2.0.0

17. 第三方服務集成問題

Firebase 配置錯誤

  • :Firebase 項目配置錯誤導致應用崩潰
  • 解決方案
    • 確保所有平臺(Android, iOS, Web)都正確配置了 Firebase
    • 檢查 google-services.json 和 GoogleService-Info.plist 文件是否正確放置
    • 使用 FlutterFire CLI 進行自動配置:dart pub global activate flutterfire_cli

廣告集成問題

  • :廣告加載失敗或表現異常
  • 解決方案
    • 使用測試廣告 ID 進行開發
    • 實現適當的錯誤處理,避免廣告失敗影響應用體驗
    • 遵循廣告平臺的最佳實踐和政策

18. 測試相關問題

測試覆蓋不足

  • :缺乏自動化測試導致回歸問題
  • 解決方案:編寫單元測試、Widget測試和集成測試
// Widget 測試示例
testWidgets('Counter increments smoke test', (WidgetTester tester) async {await tester.pumpWidget(MyApp());expect(find.text('0'), findsOneWidget);await tester.tap(find.byIcon(Icons.add));await tester.pump();expect(find.text('1'), findsOneWidget);
});

模擬和依賴注入問題

  • :難以測試與外部服務交互的代碼
  • 解決方案:使用依賴注入和接口隔離原則,方便在測試中模擬外部依賴
// 錯誤:直接硬編碼依賴
class UserRepository {final FirebaseFirestore _firestore = FirebaseFirestore.instance;Future<User> getUser(String id) async {// 直接使用 Firestore,難以測試}
}// 正確:使用依賴注入
class UserRepository {final FirebaseFirestore _firestore;UserRepository(this._firestore);Future<User> getUser(String id) async {// 使用注入的 Firestore 實例}
}// 在測試中可以模擬 Firestore
final mockFirestore = MockFirebaseFirestore();
final repository = UserRepository(mockFirestore);

19. 發布和部署問題

版本管理不當

  • :版本號管理混亂導致應用商店拒絕更新
  • 解決方案
    • 使用語義化版本號(Semantic Versioning)
    • 確保 Android 的 versionCode 和 iOS 的 build number 每次發布都遞增
# pubspec.yaml
version: 1.2.3+42  # 1.2.3 是版本號,42 是構建號

密鑰和證書管理

  • :丟失簽名密鑰導致無法更新應用
  • 解決方案
    • 安全備份簽名密鑰和密碼
    • 使用 CI/CD 系統時,安全地管理密鑰信息
    • 考慮使用 Google Play App Signing 或 Apple's App Store Connect 管理簽名

20. 錯誤監控和分析

缺乏生產環境錯誤監控

  • :無法獲知用戶在實際使用中遇到的問題
  • 解決方案:集成錯誤報告服務如 Firebase Crashlytics, Sentry 等
// 集成 Sentry 示例
Future<void> main() async {await SentryFlutter.init((options) {options.dsn = 'https://example@sentry.io/example';options.tracesSampleRate = 1.0;},appRunner: () => runApp(MyApp()),);
}

分析數據不足

  • :無法了解用戶使用模式和應用性能
  • 解決方案:集成分析服務如 Firebase Analytics,收集關鍵用戶行為和性能指標

總結:Flutter 開發最佳實踐

  1. 漸進式采用:從簡單項目開始,逐步掌握 Flutter 的各個方面

  2. 保持更新:定期更新 Flutter SDK 和依賴包,但在生產環境中保持穩定版本

  3. 組件化設計

    • 將 UI 拆分為小的、可重用的組件
    • 應用單一職責原則
    • 使用 const 構造函數優化性能
  4. 狀態管理選擇

    • 小項目:setState 或 Provider
    • 中型項目:Riverpod 或 Bloc
    • 大型項目:考慮更完整的狀態管理解決方案如 Redux
  5. 性能優化

    • 使用 DevTools 分析性能
    • 優化列表渲染,考慮使用 ListView.builder
    • 避免在 build 方法中進行昂貴的計算
  6. 開發工作流

    • 使用 Flutter 命令行工具提高效率
    • 熟練使用熱重載功能
    • 配置良好的 IDE 環境,使用 Flutter 和 Dart 插件
  7. 測試策略

    • 編寫單元測試檢驗業務邏輯
    • 使用 Widget 測試驗證 UI
    • 實施集成測試確保整體功能正常
  8. 錯誤處理

    • 實現全面的錯誤處理策略
    • 使用 try/catch 處理預期異常
    • 集成錯誤報告工具收集用戶遇到的問題
  9. 代碼風格

    • 遵循 Dart 風格指南
    • 使用強類型和空安全特性
    • 定期進行代碼審查
  10. 持續學習

    • 關注 Flutter 官方博客和更新
    • 參與 Flutter 社區
    • 學習其他開發者的經驗和最佳實踐

通過注意這些常見的"坑"和采納最佳實踐,你可以避免許多常見的 Flutter 開發問題,創建出高質量、高性能的應用程序。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/74657.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/74657.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/74657.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++智能指針萬字詳細講解(包含智能指針的模擬實現)

在筆試&#xff0c;面試中智能指針經常出現&#xff0c;如果你對智能指針的作用&#xff0c;原理&#xff0c;用法不了解&#xff0c;那么可以看看這篇博客講解&#xff0c;此外本博客還簡單模擬實現了各種指針&#xff0c;在本篇的最后還應對面試題對智能指針的知識點進行了拓…

【Go】Go語言結構體筆記

整體介紹 雖然 Go 語言不是傳統意義上的面向對象語言&#xff0c;但它提供了結構體&#xff08;struct&#xff09;來組織數據&#xff0c;并且可以為結構體綁定方法&#xff0c;從而達到面向對象的部分效果。 關鍵知識點包括&#xff1a; 結構體定義與實例化 定義結構體時使用…

Three.js 快速入門教程【十八】射線拾取模型——鼠標點擊屏幕選中模型或物體

系列文章目錄 Three.js 快速入門教程【一】開啟你的 3D Web 開發之旅 Three.js 快速入門教程【二】透視投影相機 Three.js 快速入門教程【三】渲染器 Three.js 快速入門教程【四】三維坐標系 Three.js 快速入門教程【五】動畫渲染循環 Three.js 快速入門教程【六】相機控件 Or…

Object.defineProperty()Proxy詳解(Vue23數據劫持實現)

底層原理&#x1f447;&#x1f3ff; 總結一下&#xff0c;結構應該包括&#xff1a; 1. 方法的基本作用和參數。 2. 數據描述符和存取描述符的區別。 3. 屬性定義的內部處理流程。 4. 在Vue中的應用實例。 5. 常見錯誤和正確實踐。 每個部分都要結合搜索結果的信息&…

MySQL 進階語法:函數、約束、多表查詢、事務

目錄 一、MySQL 常用函數 1. 字符串函數 1.1 基本字符串操作 1.2 字符串截取與處理 1.3 字符串搜索與替換 2. 數值函數 2.1 基本數學運算 2.2 數學計算 2.3 隨機數與符號 3. 日期時間函數 3.1 獲取當前時間 3.2 日期時間計算 3.3 日期時間提取 3.4 日期時間格式化…

第 12 章(番外)| Solidity 安全前沿趨勢 × 審計生態 × 職業路徑規劃

&#x1f310; 第 12 章&#xff08;番外&#xff09;| Solidity 安全前沿趨勢 審計生態 職業路徑規劃 ——做得了審計&#xff0c;也接得了項目&#xff0c;走進 Web3 安全工程師的職業實戰地圖 ? 本章導讀 Solidity 安全&#xff0c;不只是代碼安全、業務安全、審計安全…

1、pytest基本用法

目錄 先給大家分享下學習資源 1. 安裝pytest 2. 編寫用例規則 3. 執行用例 最近在學習pytest的用法 并且用這套框架替換了原來的unittest&#xff0c; 同是測試框架 確實感覺到pytest更加便捷 這邊分享給大家我得學習心得 先給大家分享下學習資源 1 官方文檔 pytest 官方…

【sylar-webserver】5 協程調度模塊

文章目錄 設計思路三種協程的切換 協程調度模塊&#xff0c;需要把前面的線程模塊和協程模塊結合使用 ~ 設計思路 構造函數定義 線程池 基本信息。start()&#xff0c;創建線程池&#xff0c;每個線程創建都執行 run()。每個線程在 run() 里&#xff0c;查找任務隊列 m_tasks…

Go 語言規范學習(1)

文章目錄 IntroductionNotation示例&#xff08;Go 語言的 if 語句&#xff09;&#xff1a; Source code representationCharacters例子&#xff1a;變量名可以是中文 Letters and digits Lexical elementsCommentsTokensSemicolons例子&#xff1a;查看程序所有的token Ident…

探索抓包利器ProxyPin,實現手機APP請求抓包,支持https請求

以下是ProxyPin的簡單介紹&#xff1a; - ProxyPin是一個開源免費HTTP(S)流量捕獲神器&#xff0c;支持 Windows、Mac、Android、IOS、Linux 全平臺系統- 可以使用它來攔截、檢查并重寫HTTP(S)流量&#xff0c;支持捕獲各種應用的網絡請求。ProxyPin基于Flutter開發&#xff0…

深度學習3-pytorch學習

深度學習3-pytorch學習 Tensor 定義與 PyTorch 操作 1. Tensor 定義&#xff1a; Tensor 是 PyTorch 中的數據結構&#xff0c;類似于 NumPy 數組。可以通過不同方式創建 tensor 對象&#xff1a; import torch# 定義一個 1D Tensor x1 torch.Tensor([3, 4])# 定義一個 Fl…

深入淺出Spring-Boot-3.x.pdf

通過網盤分享的文件&#xff1a;深入淺出Spring-Boot-3.x.pdf 鏈接: https://pan.baidu.com/s/10ZkhmeIXphEwND9Rv4EBlg?pwduatm 提取碼: uatm

springboot啟動事件CommandLineRunner使用

什么是CommandRunner CommandRunner是springboot啟動完成時會調用的一個runner 啟動參數會傳遞到這個runner 我們能用來做一些初始化工作和緩存預熱等工作 ApplicationRunner VS CommandRunner? 這兩個Runner作用一樣 只是得到的啟動參數格式不一樣 前者是一個Argument對象…

數據可視化TensorboardX和tensorBoard安裝及使用

tensorBoard 和TensorboardX 安裝及使用指南 tensorBoard 和 TensorBoardX 是用于可視化機器學習實驗和模型訓練過程的工具。TensorBoard 是 TensorFlow 官方提供的可視化工具&#xff0c;而 TensorBoardX 是其社區驅動的替代品&#xff0c;支持 PyTorch 等其他框架。以下是它…

藍橋杯C++基礎算法-多重背包

這段代碼實現了一個多重背包問題的動態規劃解法。多重背包問題與完全背包問題類似&#xff0c;但每個物品有其數量限制。以下是代碼的詳細思路解析&#xff1a; 1. 問題背景 給定 n 個物品&#xff0c;每個物品有其體積 v[i]、價值 w[i] 和數量 s[i]&#xff0c;以及一個容量為…

【SUNO】【AI作詞】【提示詞】

仿寫歌詞提示詞模板&#xff08;升級版&#xff09; 一、仿寫目標 風格定位 音樂風格&#xff1a; [填寫目標風格&#xff0c;如&#xff1a;民謠/流行/古風/電子/爵士等]參考案例&#xff1a;如《成都》的敘事民謠&#xff0c;《孤勇者》的勵志流行。 情感基調&#xff1a; […

26考研——樹與二叉樹_樹與二叉樹的應用(5)

408答疑 文章目錄 三、樹與二叉樹的應用哈夫曼樹和哈夫曼編碼哈夫曼樹的定義概念帶權路徑長度&#xff08;WPL&#xff09;計算示例分析 哈夫曼樹的構造算法描述哈夫曼樹的性質示例 哈夫曼編碼Huffman樹的編碼規則Huffman樹的構建過程前綴編碼前綴編碼的分析及應用 Huffman樹的…

【VUE】day06 動態組件 插槽 自定義指令 ESlint

【VUE】day06 動態組件 & 插槽 & 自定義指令 1. 動態組件1.1 通過不同的按鈕展示不同的組件1.1.1回顧click 1.2 keep-alive的使用1.3 keep-alive對應的生命周期函數1.3.1 keep-alive的include屬性1.3.2 exclude 1.4 組件注冊名稱和組件聲明時name的區別1.4.1 組件聲明時…

nodejs-原型污染鏈

還是老規矩&#xff0c;邊寫邊學&#xff0c;先分享兩篇文章 深入理解 JavaScript Prototype 污染攻擊 | 離別歌 《JavaScript百煉成仙》 全書知識點整理-CSDN博客 Ctfshow web入門 nodejs篇 web334-web344_web334 ctfshow-CSDN博客 334-js審計 var express require(expr…

Oracle 數據庫通過exp/imp工具遷移指定數據表

項目需求&#xff1a;從prod數據庫遷移和復制2個表(BANK_STATE&#xff0c;HBS)的數據到uat數據庫環境。 數據庫版本&#xff1a;Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 遷移工具&#xff1a;客戶端exp/imp工具 -- 執行命令 從Prod數據庫導出數據exp us…