[{"data":1,"prerenderedAt":495},["ShallowReactive",2],{"navigation_docs_en":3,"-en-how-to-use-flutter":173,"-en-how-to-use-flutter-surround":490},[4,30,109,153],{"title":5,"path":6,"stem":7,"children":8,"page":29},"Getting Started","\u002Fen\u002Fgetting-started","en\u002F01.getting-started",[9,14,19,24],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","\u002Fen\u002Fgetting-started\u002Fintroduction","en\u002F01.getting-started\u002F1.introduction","i-ph-rocket",{"title":15,"path":16,"stem":17,"icon":18},"Installation","\u002Fen\u002Fgetting-started\u002Finstallation","en\u002F01.getting-started\u002F2.installation","i-ph-download",{"title":20,"path":21,"stem":22,"icon":23},"Quick Start","\u002Fen\u002Fgetting-started\u002Fquick-start","en\u002F01.getting-started\u002F3.quick-start","i-ph-play",{"title":25,"path":26,"stem":27,"icon":28},"Live Demo","\u002Fen\u002Fgetting-started\u002Flive-demo","en\u002F01.getting-started\u002F4.live-demo","i-ph-sparkle",false,{"title":31,"path":32,"stem":33,"children":34,"page":29},"How To","\u002Fen\u002Fhow-to","en\u002F02.how-to",[35,40,45,50,55,60,65,70,75,79,84,89,94,99,104],{"title":36,"path":37,"stem":38,"icon":39},"Use Rust","\u002Fen\u002Fhow-to\u002Fuse-rust","en\u002F02.how-to\u002F00.use-rust","simple-icons-rust",{"title":41,"path":42,"stem":43,"icon":44},"Use .NET \u002F C#","\u002Fen\u002Fhow-to\u002Fuse-csharp","en\u002F02.how-to\u002F01.use-csharp","simple-icons-dotnet",{"title":46,"path":47,"stem":48,"icon":49},"Use React Native","\u002Fen\u002Fhow-to\u002Fuse-react-native","en\u002F02.how-to\u002F02.use-react-native","simple-icons-react",{"title":51,"path":52,"stem":53,"icon":54},"Use iOS (Swift)","\u002Fen\u002Fhow-to\u002Fuse-ios-swift","en\u002F02.how-to\u002F03.use-ios-swift","simple-icons-apple",{"title":56,"path":57,"stem":58,"icon":59},"Use Android (Kotlin)","\u002Fen\u002Fhow-to\u002Fuse-android-kotlin","en\u002F02.how-to\u002F04.use-android-kotlin","simple-icons-android",{"title":61,"path":62,"stem":63,"icon":64},"Use C FFI","\u002Fen\u002Fhow-to\u002Fuse-c-ffi","en\u002F02.how-to\u002F05.use-c-ffi","simple-icons-c",{"title":66,"path":67,"stem":68,"icon":69},"Use CLI","\u002Fen\u002Fhow-to\u002Fuse-cli","en\u002F02.how-to\u002F06.use-cli","simple-icons-gnubash",{"title":71,"path":72,"stem":73,"icon":74},"Use Web","\u002Fen\u002Fhow-to\u002Fuse-web","en\u002F02.how-to\u002F07.use-web","simple-icons-javascript",{"title":76,"path":77,"stem":78,"icon":49},"Use React","\u002Fen\u002Fhow-to\u002Fuse-react","en\u002F02.how-to\u002F08.use-react",{"title":80,"path":81,"stem":82,"icon":83},"Use Node.js","\u002Fen\u002Fhow-to\u002Fuse-node","en\u002F02.how-to\u002F09.use-node","simple-icons-nodedotjs",{"title":85,"path":86,"stem":87,"icon":88},"Use Python","\u002Fen\u002Fhow-to\u002Fuse-python","en\u002F02.how-to\u002F10.use-python","simple-icons-python",{"title":90,"path":91,"stem":92,"icon":93},"Use Golang","\u002Fen\u002Fhow-to\u002Fuse-golang","en\u002F02.how-to\u002F11.use-golang","simple-icons-go",{"title":95,"path":96,"stem":97,"icon":98},"Use Java & JVM","\u002Fen\u002Fhow-to\u002Fuse-java","en\u002F02.how-to\u002F12.use-java","simple-icons-openjdk",{"title":100,"path":101,"stem":102,"icon":103},"Use Flutter & Dart","\u002Fen\u002Fhow-to\u002Fuse-flutter","en\u002F02.how-to\u002F13.use-flutter","simple-icons-flutter",{"title":105,"path":106,"stem":107,"icon":108},"Use Decoded RGB Input","\u002Fen\u002Fhow-to\u002Fuse-decoded-rgb","en\u002F02.how-to\u002F14.use-decoded-rgb","lucide-image",{"title":110,"path":111,"stem":112,"children":113,"page":29},"Advance Guide","\u002Fen\u002Fadvance-guide","en\u002F03.advance-guide",[114,119,124,129,134,139,144,149],{"title":115,"path":116,"stem":117,"icon":118},"Models & Tiers","\u002Fen\u002Fadvance-guide\u002Fmodels-and-tiers","en\u002F03.advance-guide\u002F01.models-and-tiers","i-ph-cube",{"title":120,"path":121,"stem":122,"icon":123},"Multilingual OCR","\u002Fen\u002Fadvance-guide\u002Fmultilingual-ocr","en\u002F03.advance-guide\u002F02.multilingual-ocr","i-ph-translate",{"title":125,"path":126,"stem":127,"icon":128},"Spatial Layout Reconstruction","\u002Fen\u002Fadvance-guide\u002Fspatial-layout-reconstruction","en\u002F03.advance-guide\u002F03.spatial-layout-reconstruction","i-ph-layout",{"title":130,"path":131,"stem":132,"icon":133},"Image Preprocessing & Tuning","\u002Fen\u002Fadvance-guide\u002Fimage-preprocessing-and-tuning","en\u002F03.advance-guide\u002F04.image-preprocessing-and-tuning","i-ph-sliders",{"title":135,"path":136,"stem":137,"icon":138},"Classification & Orientation","\u002Fen\u002Fadvance-guide\u002Fclassification-and-orientation","en\u002F03.advance-guide\u002F05.classification-and-orientation","i-ph-arrows-clockwise",{"title":140,"path":141,"stem":142,"icon":143},"Performance & Benchmarks","\u002Fen\u002Fadvance-guide\u002Fperformance-and-benchmarks","en\u002F03.advance-guide\u002F06.performance-and-benchmarks","i-ph-chart-line-up",{"title":145,"path":146,"stem":147,"icon":148},"Troubleshooting","\u002Fen\u002Fadvance-guide\u002Ftroubleshooting","en\u002F03.advance-guide\u002F07.troubleshooting","i-ph-wrench",{"title":150,"path":151,"stem":152,"icon":138},"v0.2 to v0.3","\u002Fen\u002Fadvance-guide\u002Fmigration-guide","en\u002F03.advance-guide\u002F08.migration-guide",{"title":154,"path":155,"stem":156,"children":157,"page":29},"Api Reference","\u002Fen\u002Fapi-reference","en\u002F04.api-reference",[158,163,168],{"title":159,"path":160,"stem":161,"icon":162},"InitializeConfig","\u002Fen\u002Fapi-reference\u002Finitialize-config","en\u002F04.api-reference\u002F01.initialize-config","i-ph-code-block",{"title":164,"path":165,"stem":166,"icon":167},"OcrRunOptions","\u002Fen\u002Fapi-reference\u002Focr-run-options","en\u002F04.api-reference\u002F02.ocr-run-options","i-ph-faders",{"title":169,"path":170,"stem":171,"icon":172},"TextResult & Output Modes","\u002Fen\u002Fapi-reference\u002Ftext-result-and-output","en\u002F04.api-reference\u002F03.text-result-and-output","i-ph-textbox",{"id":174,"title":100,"body":175,"description":482,"extension":483,"links":484,"meta":485,"navigation":486,"path":101,"seo":487,"stem":102,"__hash__":489},"docs_en\u002Fen\u002F02.how-to\u002F13.use-flutter.md",{"type":176,"value":177,"toc":469},"minimark",[178,191,195,200,228,232,249,252,256,259,324,326,330,334,386,390,414,416,420,440,442,446,465],[179,180,181,182,186,187,190],"p",{},"RustO! provides both pure Dart FFI bindings (",[183,184,185],"code",{},"rusto",") and a native Flutter plugin (",[183,188,189],{},"rusto_flutter",") with Android and iOS platform integration.",[192,193,15],"h2",{"id":194},"installation",[196,197,199],"h3",{"id":198},"for-flutter-projects","For Flutter Projects",[201,202,207],"pre",{"className":203,"code":204,"language":205,"meta":206,"style":206},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark monokai","flutter pub add rusto_flutter\n","bash","",[183,208,209],{"__ignoreMap":206},[210,211,214,218,222,225],"span",{"class":212,"line":213},"line",1,[210,215,217],{"class":216},"sR7ES","flutter",[210,219,221],{"class":220},"sLACW"," pub",[210,223,224],{"class":220}," add",[210,226,227],{"class":220}," rusto_flutter\n",[196,229,231],{"id":230},"for-pure-dart-server-projects","For Pure Dart \u002F Server Projects",[201,233,235],{"className":203,"code":234,"language":205,"meta":206,"style":206},"dart pub add rusto\n",[183,236,237],{"__ignoreMap":206},[210,238,239,242,244,246],{"class":212,"line":213},[210,240,241],{"class":216},"dart",[210,243,221],{"class":220},[210,245,224],{"class":220},[210,247,248],{"class":220}," rusto\n",[250,251],"hr",{},[192,253,255],{"id":254},"_1-engine-initialization","1. Engine Initialization",[179,257,258],{},"Initialize the engine by supplying model weights and dictionary configuration:",[201,260,263],{"className":261,"code":262,"language":241,"meta":206,"style":206},"language-dart shiki shiki-themes material-theme-lighter github-light github-dark monokai","import 'package:rusto\u002Frusto.dart';\n\nfinal config = '''\n{\n  \"detection\": { \"model_path\": \"assets\u002Fmodels\u002FPPOCR_v6\u002Fdet.rten\" },\n  \"recognition\": { \"model_path\": \"assets\u002Fmodels\u002FPPOCR_v6\u002Frec.rten\", \"dict_path\": \"assets\u002Fmodels\u002FPPOCR_v6\u002Fdict.txt\" }\n}\n''';\n\nfinal engine = RustO.initialize(config);\n",[183,264,265,270,277,283,289,295,301,307,313,318],{"__ignoreMap":206},[210,266,267],{"class":212,"line":213},[210,268,269],{},"import 'package:rusto\u002Frusto.dart';\n",[210,271,273],{"class":212,"line":272},2,[210,274,276],{"emptyLinePlaceholder":275},true,"\n",[210,278,280],{"class":212,"line":279},3,[210,281,282],{},"final config = '''\n",[210,284,286],{"class":212,"line":285},4,[210,287,288],{},"{\n",[210,290,292],{"class":212,"line":291},5,[210,293,294],{},"  \"detection\": { \"model_path\": \"assets\u002Fmodels\u002FPPOCR_v6\u002Fdet.rten\" },\n",[210,296,298],{"class":212,"line":297},6,[210,299,300],{},"  \"recognition\": { \"model_path\": \"assets\u002Fmodels\u002FPPOCR_v6\u002Frec.rten\", \"dict_path\": \"assets\u002Fmodels\u002FPPOCR_v6\u002Fdict.txt\" }\n",[210,302,304],{"class":212,"line":303},7,[210,305,306],{},"}\n",[210,308,310],{"class":212,"line":309},8,[210,311,312],{},"''';\n",[210,314,316],{"class":212,"line":315},9,[210,317,276],{"emptyLinePlaceholder":275},[210,319,321],{"class":212,"line":320},10,[210,322,323],{},"final engine = RustO.initialize(config);\n",[250,325],{},[192,327,329],{"id":328},"_2-text-recognition","2. Text Recognition",[196,331,333],{"id":332},"structured-recognition","Structured Recognition",[201,335,337],{"className":261,"code":336,"language":241,"meta":206,"style":206},"\u002F\u002F Run recognition on local image file\nfinal results = engine.detectTextFile('receipt.jpg');\n\nfor (final line in results) {\n  print('[${line.score.toStringAsFixed(2)}] ${line.text}');\n  print('  Frame: left=${line.frame.left}, top=${line.frame.top}, w=${line.frame.width}, h=${line.frame.height}');\n}\n\n\u002F\u002F Clean up native resources when done\nengine.close();\n",[183,338,339,344,349,353,358,363,368,372,376,381],{"__ignoreMap":206},[210,340,341],{"class":212,"line":213},[210,342,343],{},"\u002F\u002F Run recognition on local image file\n",[210,345,346],{"class":212,"line":272},[210,347,348],{},"final results = engine.detectTextFile('receipt.jpg');\n",[210,350,351],{"class":212,"line":279},[210,352,276],{"emptyLinePlaceholder":275},[210,354,355],{"class":212,"line":285},[210,356,357],{},"for (final line in results) {\n",[210,359,360],{"class":212,"line":291},[210,361,362],{},"  print('[${line.score.toStringAsFixed(2)}] ${line.text}');\n",[210,364,365],{"class":212,"line":297},[210,366,367],{},"  print('  Frame: left=${line.frame.left}, top=${line.frame.top}, w=${line.frame.width}, h=${line.frame.height}');\n",[210,369,370],{"class":212,"line":303},[210,371,306],{},[210,373,374],{"class":212,"line":309},[210,375,276],{"emptyLinePlaceholder":275},[210,377,378],{"class":212,"line":315},[210,379,380],{},"\u002F\u002F Clean up native resources when done\n",[210,382,383],{"class":212,"line":320},[210,384,385],{},"engine.close();\n",[196,387,389],{"id":388},"from-uint8list-image-bytes","From Uint8List Image Bytes",[201,391,393],{"className":261,"code":392,"language":241,"meta":206,"style":206},"import 'dart:io';\n\nfinal bytes = File('document.png').readAsBytesSync();\nfinal results = engine.detectTextData(bytes);\n",[183,394,395,400,404,409],{"__ignoreMap":206},[210,396,397],{"class":212,"line":213},[210,398,399],{},"import 'dart:io';\n",[210,401,402],{"class":212,"line":272},[210,403,276],{"emptyLinePlaceholder":275},[210,405,406],{"class":212,"line":279},[210,407,408],{},"final bytes = File('document.png').readAsBytesSync();\n",[210,410,411],{"class":212,"line":285},[210,412,413],{},"final results = engine.detectTextData(bytes);\n",[250,415],{},[192,417,419],{"id":418},"_3-spatial-layout-reconstruction","3. Spatial Layout Reconstruction",[201,421,423],{"className":261,"code":422,"language":241,"meta":206,"style":206},"final spatialText = engine.detectTextFileSpatial('invoice.png');\nprint('--- Spatial Document Layout ---');\nprint(spatialText);\n",[183,424,425,430,435],{"__ignoreMap":206},[210,426,427],{"class":212,"line":213},[210,428,429],{},"final spatialText = engine.detectTextFileSpatial('invoice.png');\n",[210,431,432],{"class":212,"line":272},[210,433,434],{},"print('--- Spatial Document Layout ---');\n",[210,436,437],{"class":212,"line":279},[210,438,439],{},"print(spatialText);\n",[250,441],{},[192,443,445],{"id":444},"_4-best-practices-in-flutter-tests","4. Best Practices in Flutter Tests",[179,447,448,449,452,453,456,457,460,461,464],{},"When writing ",[183,450,451],{},"testWidgets"," that interact with native FFI loops, always load fixture files using synchronous file operations (",[183,454,455],{},"File(path).readAsBytesSync()",") rather than asynchronous ",[183,458,459],{},"await File(path).readAsBytes()",". This avoids event loop scheduling stalls within Flutter's ",[183,462,463],{},"FakeAsync"," test zones.",[466,467,468],"style",{},"html pre.shiki code .sR7ES, html code.shiki .sR7ES{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .sLACW, html code.shiki .sLACW{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}",{"title":206,"searchDepth":272,"depth":272,"links":470},[471,475,476,480,481],{"id":194,"depth":272,"text":15,"children":472},[473,474],{"id":198,"depth":279,"text":199},{"id":230,"depth":279,"text":231},{"id":254,"depth":272,"text":255},{"id":328,"depth":272,"text":329,"children":477},[478,479],{"id":332,"depth":279,"text":333},{"id":388,"depth":279,"text":389},{"id":418,"depth":272,"text":419},{"id":444,"depth":272,"text":445},"Using RustO! OCR engine in Flutter mobile, desktop, and pure Dart applications via FFI.","md",null,{},{"icon":103},{"title":488,"description":482},"Use Flutter & Dart - RustO!","59AU7i3Riu6BEPU4WtSgIm6xPPN2Mpi-UpOu8iIYqZQ",[491,493],{"title":95,"path":96,"stem":97,"description":492,"icon":98,"children":-1},"Using the native RustO! OCR engine in Java, Kotlin, and Scala applications via JNA.",{"title":105,"path":106,"stem":107,"description":494,"icon":108,"children":-1},"High-performance OCR directly from uncompressed, decoded interleaved RGB8 pixel buffers in Rust, C FFI, and language bindings.",1792905889192]