plugins.dart 4.6 KB

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