plugins.dart 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. import 'package:flutter/material.dart';
  2. import 'tools/binomial_distribution.dart';
  3. import 'tools/bisection_method.dart';
  4. import 'tools/chi_square.dart';
  5. import 'tools/circle_equation.dart';
  6. import 'tools/convolution_calculator.dart';
  7. import 'tools/cuo_wei_xiang_jian.dart';
  8. import 'tools/cycle_coloring.dart';
  9. import 'tools/function_plotter.dart';
  10. import 'tools/group_allocation.dart';
  11. import 'tools/histogram.dart';
  12. import 'tools/hypergeometric_distribution.dart';
  13. import 'tools/mixed_variance.dart';
  14. import 'tools/parametric_plotter.dart';
  15. import 'tools/regression.dart';
  16. import 'tools/statistical_charts.dart';
  17. import 'tools/symmetry.dart';
  18. import 'tools/vector_normal.dart';
  19. /// 一个数学工具插件。
  20. ///
  21. /// 插件是**编译期**的 Dart 模块 —— Dart 是 AOT 编译的,没有运行时动态加载,
  22. /// 所以"插件"在这里就是「一套接口 + 一张写死的注册表」,加插件要重新编译。
  23. /// 按设计(Q18),用户和 MCP 都不能创建插件,只有开发者能。
  24. @immutable
  25. class ToolPlugin {
  26. /// 显示名,同时用于搜索。
  27. final String name;
  28. final IconData icon;
  29. /// 页面入口。每次导航都新建实例,保证工具状态是干净的。
  30. final Widget Function() build;
  31. /// 命令入口(可选)。
  32. ///
  33. /// 按 Q26b 的约定 **先只做页面入口,命令入口增量补** —— 目前全部为 null。
  34. /// 接命令时,这里填命令名,并在控制台的 _runCommand 里分发。
  35. final String? command;
  36. /// 额外的搜索关键词(拼音首字母等)。
  37. final List<String> keywords;
  38. const ToolPlugin({
  39. required this.name,
  40. required this.icon,
  41. required this.build,
  42. this.command,
  43. this.keywords = const [],
  44. });
  45. bool matches(String q) {
  46. final query = q.trim().toLowerCase();
  47. if (query.isEmpty) return true;
  48. if (name.toLowerCase().contains(query)) return true;
  49. if (command?.toLowerCase().contains(query) ?? false) return true;
  50. return keywords.any((k) => k.toLowerCase().contains(query));
  51. }
  52. }
  53. /// 全部插件。顺序沿用 mathtool2 的注册表。
  54. final List<ToolPlugin> kTools = [
  55. ToolPlugin(
  56. name: '错位相减法',
  57. icon: Icons.functions,
  58. keywords: ['cuowei', 'cwxj', '数列'],
  59. build: () => CuoWeiXiangJianPage(),
  60. ),
  61. ToolPlugin(
  62. name: '二项分布',
  63. icon: Icons.casino_outlined,
  64. keywords: ['binomial', 'exbf', '概率'],
  65. build: () => BinomialDistributionPage(),
  66. ),
  67. ToolPlugin(
  68. name: '超几何分布',
  69. icon: Icons.pie_chart_outline,
  70. keywords: ['hypergeometric', 'cjhf', '概率'],
  71. build: () => HypergeometricDistributionPage(),
  72. ),
  73. ToolPlugin(
  74. name: '卷积分布列',
  75. icon: Icons.layers_outlined,
  76. keywords: ['convolution', 'juanji', 'jj'],
  77. build: () => ConvolutionCalculatorPage(),
  78. ),
  79. ToolPlugin(
  80. name: '卡方检验',
  81. icon: Icons.rule,
  82. keywords: ['chi square', 'kfjy', '统计'],
  83. build: () => ChiSquarePage(),
  84. ),
  85. ToolPlugin(
  86. name: '线性回归',
  87. icon: Icons.show_chart,
  88. keywords: ['regression', 'xxhg', '统计'],
  89. build: () => RegressionPage(),
  90. ),
  91. ToolPlugin(
  92. name: '混合方差',
  93. icon: Icons.balance_outlined,
  94. keywords: ['variance', 'hhfc', '统计'],
  95. build: () => MixedVariancePage(),
  96. ),
  97. ToolPlugin(
  98. name: '直方图统计',
  99. icon: Icons.bar_chart,
  100. keywords: ['histogram', 'zft', '统计'],
  101. build: () => HistogramPage(),
  102. ),
  103. ToolPlugin(
  104. name: '统计图表',
  105. icon: Icons.area_chart,
  106. keywords: ['chart', 'tjth', '图表'],
  107. build: () => StatisticalChartsPage(),
  108. ),
  109. ToolPlugin(
  110. name: '分组分配',
  111. icon: Icons.groups_outlined,
  112. keywords: ['stirling', 'fzfp', '分组', '组合'],
  113. build: () => GroupAllocationPage(),
  114. ),
  115. ToolPlugin(
  116. name: 'n 边形染色',
  117. icon: Icons.palette_outlined,
  118. keywords: ['coloring', 'ranse', '染色', '图论'],
  119. build: () => CycleColoringPage(),
  120. ),
  121. ToolPlugin(
  122. name: '对称变换',
  123. icon: Icons.swap_horiz,
  124. keywords: ['symmetry', 'dcbh', '几何'],
  125. build: () => SymmetryPage(),
  126. ),
  127. ToolPlugin(
  128. name: '圆的方程',
  129. icon: Icons.circle_outlined,
  130. keywords: ['circle', 'ydfc', '几何'],
  131. build: () => CircleEquationPage(),
  132. ),
  133. ToolPlugin(
  134. name: '三点法向量',
  135. icon: Icons.view_in_ar_outlined,
  136. keywords: ['normal', 'sdfxl', '向量', '立体几何'],
  137. build: () => VectorNormalPage(),
  138. ),
  139. ToolPlugin(
  140. name: '二分法求根',
  141. icon: Icons.search,
  142. keywords: ['bisection', 'effqg', '求根'],
  143. build: () => BisectionMethodPage(),
  144. ),
  145. ToolPlugin(
  146. name: '函数图像绘制',
  147. icon: Icons.timeline,
  148. keywords: ['plot', 'hstx', '绘图'],
  149. build: () => FunctionPlotterPage(),
  150. ),
  151. ToolPlugin(
  152. name: '参数方程绘图',
  153. icon: Icons.gesture,
  154. keywords: ['parametric', 'csfc', '绘图'],
  155. build: () => ParametricPlotterPage(),
  156. ),
  157. ];