在父子部件之间传递数据

时间:2020-08-25 12:22:06

标签: flutter inheritance dart

我有三节课。

展示台: 经理,仅处理小部件上的手势(告诉其他类以调用其 函数,例如:onTap:(){AVisualizer.onTap});

GraphVisulizer: 将数据可视化为图形。

MazeVisualizer: 将数据可视化为迷宫。

来自AVisualizer的MazeVisualizer和GraphVisulizer继承,其中包括onTap()函数,AVisualizer = MazeVisualizer || GraphVisulizer

Visualizer的孩子是AVisualizer。

我从Java转到了扑扑。 (我知道有一个解决方案,其中我只能使用GraphVisulizer,MazeVisualizer代替。但是,如果将来我想添加另一个可视化器,它将变得更加困难。)

可视化工具具有位置。但是,我想使用图类绘制顶点。 顶点大小根据屏幕大小而变化。我想检查顶点是否可以 如果在寄宿生中,则可以通过破解将其添加到GraphVisulizer中:

bool isInBorder(Offset position){//relative position from the left corner of widget
      return (position.dx > vertexRadious && position.dx < widgetSize - vertexRadious) &&
             (position.dy > vertexRadious && position.dy < widgetSize - vertexRadious);
     }

但是vertexSize存在问题,我在graphVisulizer的构建方法中定义了该问题。

The error:  

NoSuchMethodError: '<Unexpected Null Value>'
method not found
Receiver: null
Arguments: []

预先感谢,加油!

下面是一些代码:

class GraphVisualizer extends StatefulWidget {
  double size;
  final Function notifyObserver;

  GraphVisualizer({Key key, @required this.size, @required this.notifyObserver})
      : super(key: key);
  double vertexSize;

  /* When been taped by user */
  void onTap(position) {
    print(isInBorders(position));
  }

  bool isInBorders(Offset position) {
    double border = vertexSize / 4;
    return true;
    // return ((position.dx > border && position.dx < size - border) &&
    // (position.dy > border && position.dy < size - border));
  }

  @override
  _GraphVisualizerState createState() => _GraphVisualizerState();
}

lass _GraphVisualizerState extends State<GraphVisualizer> {
  HashSet<Vertex> _vertex; // hash set of all vertex
  HashSet<Edge> _edges; //hash map of all edges
  GraphDesign _graphDesign; // all the design info

  @override
  void initState() {
    super.initState();
    setState(() {
      _vertex = HashSet();
      _edges = HashSet();
      // addVertex(startPoint);
      // addVertex(startPoint);
    });
  }

/**__________________________________________________________________ */

  @override
  Widget build(BuildContext context) {
    widget.vertexSize = _graphDesign.getVertexSize();//use contex to caculate size
    return Stack(
      children: [
        Stack(
          children: _edges.toList(),
        ),
        Stack(
          children: _vertex.toList(),
        ),
      ],
    );
  }

 @override
  Widget build(BuildContext context) {
    VisualizerDesign design = VisualizerDesign(context);
    _graphVisualizer = GraphVisualizer(
      size: design.getSize(),
      notifyObserver: refresh,
    );
    Align visulizeBuild = Align(
      key: _graphKey,
      alignment: Alignment.center,
      child: Container(
        child: PositionedTapDetector(
          behavior: HitTestBehavior.translucent,
          onTap: (position) {
            Offset relative = _getRelativePosition(position.global);
            _graphVisualizer.onTap(relative);
          },
           child: _graphVisualizer,
        ),
      ),
    );
    return visulizeBuild;
  }

0 个答案:

没有答案