alexst07 / flutter_node_editor

Package for creating visual programming interfaces inspired by Blender Nodes and Unreal Engine Blueprints. https://pub.dev/packages/node_editor
BSD 3-Clause "New" or "Revised" License
17 stars 4 forks source link

renderBox of type Null instead of RenderBox in getNodeWidgetSize. #1

Closed ShaSam2104 closed 2 days ago

ShaSam2104 commented 1 week ago

@alexst07

import 'package:flutter/material.dart';
import 'package:node_editor/node_editor.dart';

import 'nodes.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final NodeEditorController controller = NodeEditorController();
  final FocusNode _focusNode = FocusNode();
  final FocusNode _focusNode2 = FocusNode();
  TextEditingController _controller = TextEditingController();
  @override
  void initState() {
    controller.addSelectListener((Connection conn) {
      debugPrint("ON SELECT inNode: ${conn.inNode}, inPort: ${conn.inPort}");
    });

    controller.addNode(
      componentNode('node_1_1'),
      NodePosition.afterLast,
    );
    controller.addNode(
      componentNode('node_1_2'),
      NodePosition.afterLast,
    );
    controller.addNode(
      componentNode('node_1_3'),
      NodePosition.afterLast,
    );
    controller.addNode(
      receiverNode('node_2_1', _focusNode2, _controller),
      NodePosition.afterLast,
    );
    controller.addNode(
      binaryNode('node_3_1'),
      NodePosition.afterLast,
    );
    controller.addNode(
      sinkNode('node_4_1'),
      NodePosition.afterLast,
    );
    super.initState();
  }
  void _addNewNode() {
    controller.addNode(
      componentNode('new_node'),
      NodePosition.afterLast,
    );
  }
  @override
  void dispose() {
    _focusNode.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text(widget.title),
        actions: [
          IconButton(
              onPressed: () {
                debugPrint('controller.toMap(): ${controller.toJson()}');
              },
              icon: Icon(Icons.abc))
        ],
      ),
      body: NodeEditor(
        focusNode: _focusNode,
        controller: controller,
        background: const GridBackground(
          backgroundColor: Color(0xfdfffd),
          lineColor: Color.fromARGB(255, 255, 255, 255),
          strokeWidth: 1,
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _addNewNode,
        child: Icon(Icons.add),
      ),
    );
  }
}

I am getting the following error when the button is pressed and this was the stack when the button was pressed Connecting to VM Service at ws://127.0.0.1:64992/QngPEayh25k=/ws flutter: Set stackPos

════════ Exception caught by widgets library ═══════════════════════════════════ The following _TypeError was thrown building LayoutBuilder: type 'Null' is not a subtype of type 'RenderBox' in type cast

The relevant error-causing widget was: NodeEditor NodeEditor:file:///Users/samyashah21/Downloads/alexst07%20flutter_node_editor%20master%20examples-advanced/lib/main.dart:101:16

When the exception was thrown, this was the stack:

0 NodesManager.getNodeWidgetSize (package:node_editor/src/nodes.dart:243:48)

1 NodeEditorController.getMaxScreenSize (package:node_editor/src/controller.dart:77:32)

2 _NodeEditorState.build.. (package:node_editor/src/custom_painter.dart:88:53)

3 _LayoutBuilderElement._layout.layoutCallback (package:flutter/src/widgets/layout_builder.dart:116:77)

4 BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2835:19)

5 _LayoutBuilderElement._layout (package:flutter/src/widgets/layout_builder.dart:150:12)

6 RenderObject.invokeLayoutCallback. (package:flutter/src/rendering/object.dart:2657:59)

7 PipelineOwner._enableMutationsToDirtySubtrees (package:flutter/src/rendering/object.dart:1071:15)

8 RenderObject.invokeLayoutCallback (package:flutter/src/rendering/object.dart:2657:14)

9 RenderConstrainedLayoutBuilder.rebuildIfNecessary (package:flutter/src/widgets/layout_builder.dart:225:7)

10 _RenderLayoutBuilder.performLayout (package:flutter/src/widgets/layout_builder.dart:308:5)

11 RenderObject._layoutWithoutResize (package:flutter/src/rendering/object.dart:2385:7)

12 PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:1025:18)

13 PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:1038:15)

14 RendererBinding.drawFrame (package:flutter/src/rendering/binding.dart:591:23)

15 WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:986:13)

16 RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:457:5)

17 SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1325:15)

18 SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1255:9)

19 SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:1113:5)

20 _invoke (dart:ui/hooks.dart:312:13)

21 PlatformDispatcher._drawFrame (dart:ui/platform_dispatcher.dart:383:5)

22 _drawFrame (dart:ui/hooks.dart:283:31)

════════════════════════════════════════════════════════════════════════════════

ShaSam2104 commented 1 week ago

Figured out the issue, it was because the RenderBox was being accessed before it was initialised.

alexst07 commented 2 days ago

Hey @ShaSam2104,

Thanks for the solution, could you please create an example with this code you posted here? As this example to demonstrate the bug was made by you, I believe it would be more fair and appropriate for you to create the example and commit.

ShaSam2104 commented 1 day ago

yess i will make changes in the example and commit it