diff --git a/packages/react-native-fantom/src/__tests__/Fantom-itest.js b/packages/react-native-fantom/src/__tests__/Fantom-itest.js
index 3eb82e160c52..46b0304d3ca5 100644
--- a/packages/react-native-fantom/src/__tests__/Fantom-itest.js
+++ b/packages/react-native-fantom/src/__tests__/Fantom-itest.js
@@ -155,6 +155,22 @@ describe('Fantom', () => {
},
);
});
+
+ it('throws when trying to render a root outside of a task', () => {
+ const root = Fantom.createRoot();
+
+ expect(() => {
+ root.render();
+ }).toThrow(
+ 'Unexpected call to `render` outside of the event loop. Please call `render` within a `runTask` callback.',
+ );
+
+ expect(() => {
+ Fantom.runTask(() => {
+ root.render();
+ });
+ }).not.toThrow();
+ });
});
describe('getRenderedOutput', () => {
diff --git a/packages/react-native-fantom/src/index.js b/packages/react-native-fantom/src/index.js
index 327227d743bf..ddca12d3264e 100644
--- a/packages/react-native-fantom/src/index.js
+++ b/packages/react-native-fantom/src/index.js
@@ -57,7 +57,13 @@ class Root {
globalSurfaceIdCounter += 10;
}
- render(element: MixedElement) {
+ render(element: MixedElement): void {
+ if (!flushingQueue) {
+ throw new Error(
+ 'Unexpected call to `render` outside of the event loop. Please call `render` within a `runTask` callback.',
+ );
+ }
+
if (!this.#hasRendered) {
NativeFantom.startSurface(
this.#surfaceId,