{"id":19610368,"url":"https://github.com/yungzhu/rich_input","last_synced_at":"2025-10-04T05:05:34.790Z","repository":{"id":43061434,"uuid":"276565063","full_name":"yungzhu/rich_input","owner":"yungzhu","description":"Rich input box, implement @someone and subject with color highlighting","archived":false,"fork":false,"pushed_at":"2023-06-16T07:19:24.000Z","size":116,"stargazers_count":57,"open_issues_count":5,"forks_count":19,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-04-05T03:41:24.355Z","etag":null,"topics":["dart","flutter","input","rich","rich-text-editor","textarea","textfield","textinput"],"latest_commit_sha":null,"homepage":"","language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yungzhu.png","metadata":{"files":{"readme":"README-ZH.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-07-02T06:20:10.000Z","updated_at":"2024-06-24T08:45:29.000Z","dependencies_parsed_at":"2024-11-11T10:30:49.415Z","dependency_job_id":"05fcde17-e288-47d5-aa80-d15080dddb4a","html_url":"https://github.com/yungzhu/rich_input","commit_stats":{"total_commits":21,"total_committers":2,"mean_commits":10.5,"dds":0.04761904761904767,"last_synced_commit":"ac575de2d9ca462441e33e976454330cd64607af"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yungzhu%2Frich_input","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yungzhu%2Frich_input/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yungzhu%2Frich_input/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yungzhu%2Frich_input/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yungzhu","download_url":"https://codeload.github.com/yungzhu/rich_input/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251212007,"owners_count":21553389,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dart","flutter","input","rich","rich-text-editor","textarea","textfield","textinput"],"created_at":"2024-11-11T10:28:45.632Z","updated_at":"2025-10-04T05:05:29.745Z","avatar_url":"https://github.com/yungzhu.png","language":"Dart","funding_links":[],"categories":[],"sub_categories":[],"readme":"# rich_input\n\n这是一个高性能的富媒体输入框，通过原生的 textfield 扩展实现，具有较小的破坏性，同时具有较强的扩展性，实现了@某人，#话题，表情等功能，支持自定义高亮\n\n文档语言: [English](README.md) | [中文简体](README-ZH.md)\n\n## 特色功能\n\n-   用较少的代码，尽量使用原生的 textfield 能力，减少破坏性及后续兼容性\n-   支持@某人 #话题 插入表情等\n-   支持自定义高亮效果，及自定义样式\n-   支持使用退格键删除整个特殊文本块\n-   支持特殊字符的处理\n-   支持自定义 data 字段，增强富文本的能力\n\n![Demo](demo.png)\n\n## 开始入门\n\n核心代码\n\n```dart\nimport 'package:rich_input/rich_input.dart';\n\nRichInputController controller = RichInputController(text: \"Text\");\n\nconst block = RichBlock(\n  text: \"@somebody\",\n  data: \"@123456\",\n  style: TextStyle(color: Colors.blue),\n);\ncontroller.insertBlock(block);\n\n// 获取自定义数据\nprint(controller.data);\n// 获取文本\nprint(controller.text);\n\n// RichInput(controller: controller);\n```\n\n详细示例\n\n```dart\nimport 'package:flutter/material.dart';\nimport 'package:rich_input/rich_input.dart';\n\nvoid main() {\n  runApp(MyApp());\n}\n\nclass MyApp extends StatelessWidget {\n  @override\n  Widget build(BuildContext context) {\n    return MaterialApp(\n      title: 'Flutter Demo',\n      home: MyHomePage(),\n    );\n  }\n}\n\nclass MyHomePage extends StatefulWidget {\n  @override\n  _MyHomePageState createState() =\u003e _MyHomePageState();\n}\n\nclass _MyHomePageState extends State\u003cMyHomePage\u003e {\n  RichInputController _controller;\n  FocusNode _focusNode;\n\n  @override\n  void initState() {\n    _focusNode = FocusNode();\n    _controller = RichInputController(text: \"Text\");\n\n    // Refresh text display, not required\n    _controller.addListener(() {\n      setState(() {});\n    });\n    super.initState();\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      body: SafeArea(\n        child: Padding(\n          padding: const EdgeInsets.all(15),\n          child: Column(\n            crossAxisAlignment: CrossAxisAlignment.start,\n            children: \u003cWidget\u003e[\n              RichInput(\n                focusNode: _focusNode,\n                controller: _controller,\n              ),\n              Wrap(\n                spacing: 10,\n                children: [\n                  RaisedButton(\n                    onPressed: () {\n                      _controller.insertText(\"Text\");\n                    },\n                    child: const Text(\"Add Text\"),\n                  ),\n                  RaisedButton(\n                    onPressed: () {\n                      _controller.insertText(\"😁\");\n                    },\n                    child: const Text(\"Add 😁\"),\n                  ),\n                  RaisedButton(\n                    onPressed: () {\n                      _controller.insertText(\"👍\");\n                    },\n                    child: const Text(\"Add 👍\"),\n                  ),\n                  RaisedButton(\n                    onPressed: () {\n                      const block = RichBlock(\n                        text: \"@abc\",\n                        data: \"@123456\",\n                        style: TextStyle(\n                          color: Colors.blue,\n                          fontWeight: FontWeight.bold,\n                        ),\n                      );\n                      _controller.insertBlock(block);\n                    },\n                    child: const Text(\"Add @    \"),\n                  ),\n                  RaisedButton(\n                    onPressed: () {\n                      const block = RichBlock(\n                        text: \"#subject\",\n                        data: \"#888999\",\n                        style: TextStyle(\n                          color: Colors.red,\n                          fontWeight: FontWeight.bold,\n                        ),\n                      );\n                      _controller.insertBlock(block);\n                    },\n                    child: const Text(\"Add #\"),\n                  ),\n                  RaisedButton(\n                    onPressed: () {\n                      _focusNode.unfocus();\n                    },\n                    child: const Text(\"unfocus\"),\n                  )\n                ],\n              ),\n              const SizedBox(height: 10),\n              Text(\"Text:${_controller.text}\"),\n              const SizedBox(height: 10),\n              Text(\"Data:${_controller.data}\"),\n            ],\n          ),\n        ),\n      ),\n    );\n  }\n}\n```\n\n\u003e [详细示例，请查看](example/lib/main.dart)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyungzhu%2Frich_input","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyungzhu%2Frich_input","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyungzhu%2Frich_input/lists"}