<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>RenderBox</title>
	<atom:link href="https://techgrowup.net/tag/renderbox/feed/" rel="self" type="application/rss+xml" />
	<link>https://techgrowup.net</link>
	<description>エンジニアを強くする</description>
	<lastBuildDate>Mon, 28 Oct 2024 23:16:07 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://techgrowup.net/wp-content/uploads/2021/05/hp-icon-150x150.png</url>
	<title>RenderBox</title>
	<link>https://techgrowup.net</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Flutter開発入門64 FlutterのRenderObjectクラス完全ガイド：カスタム描画とレイアウトの基礎</title>
		<link>https://techgrowup.net/flutter-renderbox/</link>
					<comments>https://techgrowup.net/flutter-renderbox/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[techgrowup]]></dc:creator>
		<pubDate>Mon, 28 Oct 2024 23:16:04 +0000</pubDate>
				<category><![CDATA[Flutter]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Dart]]></category>
		<category><![CDATA[RenderBox]]></category>
		<category><![CDATA[アプリ開発]]></category>
		<guid isPermaLink="false">https://techgrowup.net/?p=2014</guid>

					<description><![CDATA[はじめに FlutterでUIを構築する際、一般的にはWidgetやElement、BuildContextといったレイヤーを使いますが、より細かい描画制御やカスタムレイアウトが必要な場合、Flutterのレンダリングエ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h1 class="wp-block-heading">はじめに</h1>



<p class="wp-block-paragraph">FlutterでUIを構築する際、一般的には<code>Widget</code>や<code>Element</code>、<code>BuildContext</code>といったレイヤーを使いますが、より細かい描画制御やカスタムレイアウトが必要な場合、Flutterのレンダリングエンジンの基盤である<strong>RenderObject</strong>クラスを理解する必要があります。</p>



<p class="wp-block-paragraph"><strong>RenderObject</strong>は、FlutterのUIレンダリングにおける最も低レベルのオブジェクトであり、ウィジェットが画面に描画される際のプロセスをコントロールします。RenderObjectを直接操作することで、カスタムレイアウトや高度なアニメーション、パフォーマンスチューニングが可能になります。</p>



<p class="wp-block-paragraph">この記事では、RenderObjectクラスの基本とその使い方について、詳しく解説します。Flutterアプリで高度なUI構築を目指す方は、ぜひこのRenderObjectの仕組みを理解しておきましょう。</p>



<h2 class="wp-block-heading">RenderObjectとは</h2>



<p class="wp-block-paragraph"><strong>RenderObject</strong>は、Flutterの描画システムの中心となるクラスであり、各UI要素が画面上にどのように配置され、描画されるかを管理します。Flutterのウィジェットシステムは、<code>Widget</code>（構造）→<code>Element</code>（インスタンス化）→<code>RenderObject</code>（描画）の3層で構成されていますが、RenderObjectはその中でも最も低レベルで直接描画に関与します。</p>



<h3 class="wp-block-heading">RenderObjectの役割</h3>



<ul class="wp-block-list">
<li><strong>レイアウトの計算</strong>：ウィジェットの位置やサイズを決定するためのレイアウト計算を行います。</li>



<li><strong>描画の管理</strong>：ウィジェットがどのように描画されるか、特定のピクセルに何を描画するかを制御します。</li>



<li><strong>ヒットテスト</strong>：ユーザーのタップなどのイベントが、どのウィジェットに影響を与えるかを判断します。</li>
</ul>



<h2 class="wp-block-heading">RenderObjectの基本的な使い方</h2>



<p class="wp-block-paragraph">RenderObjectを使用してカスタムウィジェットを作成する場合、一般的には<code>RenderBox</code>クラスを継承してカスタムの描画とレイアウトを実装します。以下に、基本的なRenderObjectの使い方の例を紹介します。</p>



<h3 class="wp-block-heading">1. RenderBoxの基本クラスを継承する</h3>



<p class="wp-block-paragraph"><code>RenderBox</code>は、2Dボックスの形状を持つウィジェットのための基本クラスです。これを継承して、カスタムのレイアウトや描画のロジックを追加することができます。</p>



<h6 class="wp-block-heading">サンプルコード：シンプルなカスタムRenderBox</h6>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="import 'package:flutter/rendering.dart';
import 'package:flutter/material.dart';

class CustomRenderBox extends RenderBox {
  @override
  void performLayout() {
    size = constraints.biggest;  // サイズを画面全体に設定
  }

  @override
  void paint(PaintingContext context, Offset offset) {
    final paint = Paint()
      ..color = Colors.blue
      ..style = PaintingStyle.fill;

    context.canvas.drawRect(offset &amp; size, paint);
  }
}

class CustomWidget extends LeafRenderObjectWidget {
  @override
  RenderObject createRenderObject(BuildContext context) {
    return CustomRenderBox();
  }
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">import</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;package:flutter/rendering.dart&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #569CD6">import</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;package:flutter/material.dart&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">CustomRenderBox</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">extends</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">RenderBox</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">@override</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">performLayout</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    size = constraints.biggest;  </span><span style="color: #6A9955">// サイズを画面全体に設定</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">@override</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">paint</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">PaintingContext</span><span style="color: #D4D4D4"> context, </span><span style="color: #4EC9B0">Offset</span><span style="color: #D4D4D4"> offset) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">final</span><span style="color: #D4D4D4"> paint = </span><span style="color: #4EC9B0">Paint</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">      ..color = </span><span style="color: #4EC9B0">Colors</span><span style="color: #D4D4D4">.blue</span></span>
<span class="line"><span style="color: #D4D4D4">      ..style = </span><span style="color: #4EC9B0">PaintingStyle</span><span style="color: #D4D4D4">.fill;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    context.canvas.</span><span style="color: #DCDCAA">drawRect</span><span style="color: #D4D4D4">(offset &amp; size, paint);</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">CustomWidget</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">extends</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">LeafRenderObjectWidget</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">@override</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">RenderObject</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">createRenderObject</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">BuildContext</span><span style="color: #D4D4D4"> context) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">CustomRenderBox</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h3 class="wp-block-heading">2. カスタムRenderBoxの解説</h3>



<ul class="wp-block-list">
<li><strong>performLayout()</strong>：ウィジェットのサイズを決定するためのメソッドです。<code>constraints</code>（制約）に基づいて<code>size</code>を設定します。ここでは、画面全体にサイズを設定しています。</li>



<li><strong>paint()</strong>：描画のロジックを記述するメソッドです。<code>PaintingContext</code>の<code>canvas</code>を使って、指定の色で矩形を描画しています。</li>



<li><strong>LeafRenderObjectWidget</strong>：カスタムRenderObjectを使用するために必要な<code>Widget</code>クラスを作成します。<code>createRenderObject</code>メソッドでCustomRenderBoxを返すようにします。</li>
</ul>



<h3 class="wp-block-heading">3. カスタムウィジェットをアプリに組み込む</h3>



<p class="wp-block-paragraph">カスタムのRenderObjectウィジェットを作成した後は、通常のFlutterウィジェットと同様に画面上に配置できます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="void main() {
  runApp(MaterialApp(
    home: Scaffold(
      body: Center(
        child: CustomWidget(),
      ),
    ),
  ));
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">main</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #DCDCAA">runApp</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">MaterialApp</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">    home: </span><span style="color: #4EC9B0">Scaffold</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">      body: </span><span style="color: #4EC9B0">Center</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        child: </span><span style="color: #4EC9B0">CustomWidget</span><span style="color: #D4D4D4">(),</span></span>
<span class="line"><span style="color: #D4D4D4">      ),</span></span>
<span class="line"><span style="color: #D4D4D4">    ),</span></span>
<span class="line"><span style="color: #D4D4D4">  ));</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">このコードを実行すると、画面全体に青い矩形が描画されます。</p>



<h2 class="wp-block-heading">RenderObjectの高度な活用方法</h2>



<h3 class="wp-block-heading">1. カスタムレイアウトの実装</h3>



<p class="wp-block-paragraph">RenderObjectを使用することで、通常のウィジェットシステムではできないカスタムレイアウトを実装することが可能です。例えば、特定の条件に応じてウィジェットを自動的に並べ替えたり、サイズを変更したりできます。</p>



<h6 class="wp-block-heading">カスタムレイアウトの例</h6>



<p class="wp-block-paragraph">以下は、2つの子ウィジェットを縦に並べるカスタムレイアウトの例です。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="class VerticalLayout extends RenderBox
    with ContainerRenderObjectMixin&lt;RenderBox, VerticalParentData&gt;,
         RenderBoxContainerDefaultsMixin&lt;RenderBox, VerticalParentData&gt; {
  @override
  void performLayout() {
    double yPosition = 0.0;
    RenderBox? child = firstChild;

    while (child != null) {
      child.layout(constraints, parentUsesSize: true);
      final VerticalParentData childParentData = child.parentData as VerticalParentData;
      childParentData.offset = Offset(0, yPosition);
      yPosition += child.size.height;
      child = childParentData.nextSibling;
    }
    size = constraints.constrain(Size(constraints.maxWidth, yPosition));
  }
}

class VerticalParentData extends ContainerBoxParentData&lt;RenderBox&gt; {}

class VerticalLayoutWidget extends MultiChildRenderObjectWidget {
  VerticalLayoutWidget({Key? key, required List&lt;Widget&gt; children})
      : super(key: key, children: children);

  @override
  RenderObject createRenderObject(BuildContext context) {
    return VerticalLayout();
  }

  @override
  void updateRenderObject(BuildContext context, RenderObject renderObject) {}
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">VerticalLayout</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">extends</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">RenderBox</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">with</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">ContainerRenderObjectMixin</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">RenderBox</span><span style="color: #D4D4D4">, </span><span style="color: #4EC9B0">VerticalParentData</span><span style="color: #D4D4D4">&gt;,</span></span>
<span class="line"><span style="color: #D4D4D4">         </span><span style="color: #4EC9B0">RenderBoxContainerDefaultsMixin</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">RenderBox</span><span style="color: #D4D4D4">, </span><span style="color: #4EC9B0">VerticalParentData</span><span style="color: #D4D4D4">&gt; {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">@override</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">performLayout</span><span style="color: #D4D4D4">() {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #4EC9B0">double</span><span style="color: #D4D4D4"> yPosition = </span><span style="color: #B5CEA8">0.0</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #4EC9B0">RenderBox</span><span style="color: #D4D4D4">? child = firstChild;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">while</span><span style="color: #D4D4D4"> (child != </span><span style="color: #569CD6">null</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">      child.</span><span style="color: #DCDCAA">layout</span><span style="color: #D4D4D4">(constraints, parentUsesSize: </span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">final</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">VerticalParentData</span><span style="color: #D4D4D4"> childParentData = child.parentData </span><span style="color: #569CD6">as</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">VerticalParentData</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">      childParentData.offset = </span><span style="color: #4EC9B0">Offset</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">, yPosition);</span></span>
<span class="line"><span style="color: #D4D4D4">      yPosition += child.size.height;</span></span>
<span class="line"><span style="color: #D4D4D4">      child = childParentData.nextSibling;</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">    size = constraints.</span><span style="color: #DCDCAA">constrain</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">Size</span><span style="color: #D4D4D4">(constraints.maxWidth, yPosition));</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">VerticalParentData</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">extends</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">ContainerBoxParentData</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">RenderBox</span><span style="color: #D4D4D4">&gt; {}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">VerticalLayoutWidget</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">extends</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">MultiChildRenderObjectWidget</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">VerticalLayoutWidget</span><span style="color: #D4D4D4">({</span><span style="color: #4EC9B0">Key</span><span style="color: #D4D4D4">? key, </span><span style="color: #569CD6">required</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">List</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">Widget</span><span style="color: #D4D4D4">&gt; children})</span></span>
<span class="line"><span style="color: #D4D4D4">      : </span><span style="color: #569CD6">super</span><span style="color: #D4D4D4">(key: key, children: children);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">@override</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #4EC9B0">RenderObject</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">createRenderObject</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">BuildContext</span><span style="color: #D4D4D4"> context) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">VerticalLayout</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">@override</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">updateRenderObject</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">BuildContext</span><span style="color: #D4D4D4"> context, </span><span style="color: #4EC9B0">RenderObject</span><span style="color: #D4D4D4"> renderObject) {}</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h3 class="wp-block-heading">2. ヒットテストのカスタマイズ</h3>



<p class="wp-block-paragraph">RenderObjectでは、ヒットテスト（ユーザーがタップした位置にウィジェットがあるかどうかの判定）をカスタマイズすることも可能です。これにより、ユーザーのタッチイベントを細かく制御できます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="@override
bool hitTestSelf(Offset position) {
  return true;  // すべての位置でタッチを受け取る
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">@override</span></span>
<span class="line"><span style="color: #4EC9B0">bool</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">hitTestSelf</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">Offset</span><span style="color: #D4D4D4"> position) {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">;  </span><span style="color: #6A9955">// すべての位置でタッチを受け取る</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h3 class="wp-block-heading">3. カスタム描画の実装</h3>



<p class="wp-block-paragraph">カスタム描画もRenderObjectで行うことができます。例えば、<code>paint()</code>メソッドで<code>Canvas</code>を使い、テキストや図形、画像などを自由に配置できます。</p>



<h2 class="wp-block-heading">RenderObjectを使う際の注意点</h2>



<ol class="wp-block-list">
<li><strong>パフォーマンスの考慮</strong><br>RenderObjectは非常に強力ですが、低レベルな操作ができる分、パフォーマンスに影響を与える可能性があります。複雑なレイアウトや重い描画処理は、アニメーションなどに悪影響を与える可能性があるため注意が必要です。</li>



<li><strong>コードの可読性</strong><br>RenderObjectはFlutterの通常のウィジェットと比べて高度で難解なコードになります。チームでの開発や保守を考慮して、必要最低限の範囲で利用するのが良いでしょう。</li>



<li><strong>デバッグの難しさ</strong><br>RenderObjectを使うと、Flutterのデフォルトのデバッグツールが使いにくくなることがあります。パフォーマンスの問題が発生した場合、ProfilerやDevToolsを活用して慎重にデバッグしましょう。</li>
</ol>



<h2 class="wp-block-heading">まとめ</h2>



<p class="wp-block-paragraph">Flutterの<strong>RenderObject</strong>クラスを活用することで、カスタムの描画や高度なレイアウト構築が可能になります。Flutterの標準ウィジェットでは表現できない複雑なUIやレイアウトを実現できる一方で、パフォーマンスへの影響やコードの保守性には注意が必要です。</p>



<p class="wp-block-paragraph">今回の内容を参考に、<strong>RenderObject</strong>を効果的に活用し、FlutterアプリのUIをさらにカスタマイズしてみてください！</p>
]]></content:encoded>
					
					<wfw:commentRss>https://techgrowup.net/flutter-renderbox/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Disk: Enhanced  を使用したページ キャッシュ

Served from: techgrowup.net @ 2026-06-27 09:55:34 by W3 Total Cache
-->