<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>master_choi.log</title>
        <link>https://velog.io/</link>
        <description>열심이하는자</description>
        <lastBuildDate>Mon, 29 May 2023 13:51:46 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. master_choi.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/master_choi" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[firebase에서 10등까지 데이터 가져오고, 내 현재 랭킹 데이터 가져오기]]></title>
            <link>https://velog.io/@master_choi/firebase%EC%97%90%EC%84%9C-10%EB%93%B1%EA%B9%8C%EC%A7%80-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B3%A0-%EB%82%B4-%ED%98%84%EC%9E%AC-%EB%9E%AD%ED%82%B9-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0</link>
            <guid>https://velog.io/@master_choi/firebase%EC%97%90%EC%84%9C-10%EB%93%B1%EA%B9%8C%EC%A7%80-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B3%A0-%EB%82%B4-%ED%98%84%EC%9E%AC-%EB%9E%AD%ED%82%B9-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0</guid>
            <pubDate>Mon, 29 May 2023 13:51:46 GMT</pubDate>
            <description><![CDATA[<p>Firebase Realtime Database를 사용하여 10등까지의 데이터를 가져오고, 사용자의 현재 랭킹 데이터를 가져오는 방법을 안내해 드리겠습니다. 아래는 예시로 주어지는 코드입니다.</p>
<pre><code>using UnityEngine;
using UnityEngine.UI;
using Firebase;
using Firebase.Database;
using Firebase.Extensions;

public class LeaderboardUI : MonoBehaviour
{
    public Text leaderboardText; // 리더보드를 표시할 Text
    public Text myRankText; // 내 랭킹을 표시할 Text

    private DatabaseReference databaseRef; // Firebase Realtime Database 레퍼런스

    private void Start()
    {
        // Firebase Realtime Database 레퍼런스 초기화
        databaseRef = FirebaseDatabase.DefaultInstance.RootReference;

        // 리더보드 데이터 로드 및 UI 업데이트
        LoadLeaderboardData();
    }

    private void LoadLeaderboardData()
    {
        // 리더보드 데이터 조회
        databaseRef.Child(&quot;leaderboard&quot;).OrderByChild(&quot;score&quot;).LimitToFirst(10).GetValueAsync().ContinueWithOnMainThread(task =&gt;
        {
            if (task.IsFaulted || task.IsCanceled)
            {
                // 데이터 로드 실패 처리
                Debug.LogError(&quot;Failed to load leaderboard data.&quot;);
            }
            else if (task.IsCompleted)
            {
                // 리더보드 데이터 로드 성공
                DataSnapshot snapshot = task.Result;
                string leaderboardData = &quot;&quot;;

                int rank = 1;
                foreach (var childSnapshot in snapshot.Children)
                {
                    string username = childSnapshot.Child(&quot;username&quot;).Value.ToString();
                    int score = int.Parse(childSnapshot.Child(&quot;score&quot;).Value.ToString());

                    leaderboardData += rank + &quot;. &quot; + username + &quot;: &quot; + score + &quot;\n&quot;;
                    rank++;
                }

                // 리더보드 텍스트 업데이트
                leaderboardText.text = leaderboardData;

                // 내 랭킹 데이터 로드 및 업데이트
                LoadMyRankData();
            }
        });
    }

    private void LoadMyRankData()
    {
        // 사용자의 닉네임을 기반으로 현재 랭킹 데이터 조회
        string myNickname = &quot;사용자의 닉네임을 가져오는 로직을 구현해야 합니다.&quot;; // 사용자의 닉네임을 가져와야 합니다.

        // 사용자의 닉네임을 기준으로 데이터 조회
        var query = databaseRef.Child(&quot;leaderboard&quot;).OrderByChild(&quot;username&quot;).EqualTo(myNickname);

        // 쿼리 실행하여 결과 가져오기
        query.GetValueAsync().ContinueWithOnMainThread(task =&gt;
        {
            if (task.IsFaulted || task.IsCanceled)
            {
                // 데이터 로드 실패 처리
                Debug.LogError(&quot;Failed to load my rank data.&quot;);
            }
            else if (task.IsCompleted)
            {
                DataSnapshot snapshot = task.Result;

                // 사용자의 랭킹 데이터 가져오기
                if (snapshot.HasChildren)
                {
                    foreach (var childSnapshot in snapshot.Children)
                    {
                        int myRank = int.Parse(childSnapshot.Child(&quot;rank&quot;).Value.ToString());

                        // 내 랭킹 텍스트 업데이트
                        myRankText.text = &quot;내 랭킹: &quot; + myRank;
                    }
                }
                else
                {
                    // 사용자 데이터가 없는 경우 처리
                    myRankText.text = &quot;내 랭킹: 데이터 없음&quot;;
                }
            }
        });
    }
}</code></pre><p>위 코드에서는 LeaderboardUI 스크립트를 사용하여 10등까지의 리더보드 데이터와 사용자의 현재 랭킹 데이터를 가져옵니다.</p>
<p>주요 요소 설명:</p>
<ul>
<li>leaderboardText: 리더보드를 표시할 Text 컴포넌트입니다.</li>
<li>myRankText: 내 랭킹을 표시할 Text 컴포넌트입니다.</li>
<li>LoadLeaderboardData(): Firebase Realtime Database에서 10등까지의 리더보드 데이터를 조회하고, UI를 업데이트하는 함수입니다.</li>
<li>LoadMyRankData(): 사용자의 닉네임을 기준으로 현재 랭킹 데이터를 조회하고, UI를 업데이트하는 함수입니다.</li>
</ul>
<p>위 코드를 사용하면 Firebase Realtime Database에서 10등까지의 리더보드 데이터를 가져와 UI에 표시하고, 사용자의 닉네임을 기준으로 현재 랭킹 데이터를 가져와 UI에 표시합니다. 닉네임을 가져오는 로직은 구현되어야 하며, 해당 로직에 따라 사용자의 닉네임을 설정하시면 됩니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[InkWell 위젯과 GestureDetector 위젯 차이는 ]]></title>
            <link>https://velog.io/@master_choi/InkWell-%EC%9C%84%EC%A0%AF%EA%B3%BC-GestureDetector-%EC%9C%84%EC%A0%AF-%EC%B0%A8%EC%9D%B4%EB%8A%94</link>
            <guid>https://velog.io/@master_choi/InkWell-%EC%9C%84%EC%A0%AF%EA%B3%BC-GestureDetector-%EC%9C%84%EC%A0%AF-%EC%B0%A8%EC%9D%B4%EB%8A%94</guid>
            <pubDate>Sun, 16 Apr 2023 14:04:12 GMT</pubDate>
            <description><![CDATA[<p>Flutter에서 InkWell과 GestureDetector는 두 가지 다른 유형의 사용자 상호 작용을 처리하는 위젯입니다. 둘 다 터치 이벤트를 처리하고 콜백을 통해 상호 작용을 트리거하지만, 사용 방식과 효과에 차이가 있습니다.</p>
<p>InkWell:
InkWell은 Material Design을 따르는 플러터 앱에서 주로 사용됩니다. 이 위젯을 사용하면 머티리얼 디자인의 물결 효과(Ink splash)를 추가할 수 있습니다. InkWell은 터치 피드백을 제공하기 위해 물결 효과를 사용하며, 터치 이벤트에 대한 콜백 함수(onTap, onLongPress 등)를 지원합니다.</p>
<p>GestureDetector:
GestureDetector는 더 일반적이고 기본적인 터치 이벤트 처리를 위한 위젯입니다. GestureDetector는 여러 가지 제스처 이벤트를 처리할 수 있으며, onTap, onLongPress, onDoubleTap, onVerticalDragDown 등의 콜백 함수를 지원합니다. 하지만 GestureDetector에는 InkWell과 같은 물결 효과가 없습니다.</p>
<p>요약하면, 두 위젯의 주요 차이점은 다음과 같습니다:</p>
<p>InkWell은 Material Design의 물결 효과를 제공하며, 사용자 상호 작용에 대한 시각적 피드백이 필요한 경우 사용됩니다.
GestureDetector는 기본적인 터치 이벤트 처리를 위한 위젯으로, 다양한 제스처 이벤트를 처리할 수 있지만 시각적 효과는 없습니다.
사용자의 상호 작용에 따라 시각적 피드백이 필요한 경우 InkWell을 사용하고, 특정 제스처만 처리하면 되는 경우 GestureDetector를 사용하는 것이 좋습니다.
nkWell:</p>
<p>InkWell은 주로 ElevatedButton, FlatButton, FloatingActionButton 등과 같은 Material 버튼 위젯의 내부 구현에서 사용됩니다.
InkWell 위젯은 InkResponse 위젯을 기반으로 하며, 공통적인 작동 원리를 공유합니다.
InkWell 위젯을 사용할 때는 주로 Ink.image, Ink.decoration, InkResponse 위젯 등과 함께 사용하여 더 다양한 디자인 효과를 얻을 수 있습니다.
InkWell 사용 예제:</p>
<pre><code>InkWell(
  onTap: () {
    print(&#39;InkWell tapped&#39;);
  },
  child: Container(
    height: 50,
    width: 150,
    decoration: BoxDecoration(
      color: Colors.blue,
      borderRadius: BorderRadius.circular(8),
    ),
    child: Center(
      child: Text(
        &#39;Tap me&#39;,
        style: TextStyle(color: Colors.white),
      ),
    ),
  ),
)
</code></pre><p>GestureDetector:</p>
<p>GestureDetector는 여러 제스처를 동시에 처리할 수 있으며, 제스처 간의 우선순위를 지정할 수 있습니다.
확대/축소, 회전 등의 다중 터치 제스처를 처리하려면 GestureDetector의 onScaleStart, onScaleUpdate, onScaleEnd 콜백을 사용합니다.
GestureDetector를 사용하여 스와이프 제스처를 구현할 수도 있습니다. 이를 위해 onHorizontalDragUpdate, onVerticalDragUpdate 등의 콜백을 사용합니다.
GestureDetector 사용 예제</p>
<pre><code>GestureDetector(
  onTap: () {
    print(&#39;GestureDetector tapped&#39;);
  },
  onDoubleTap: () {
    print(&#39;GestureDetector double tapped&#39;);
  },
  child: Container(
    height: 50,
    width: 150,
    decoration: BoxDecoration(
      color: Colors.red,
      borderRadius: BorderRadius.circular(8),
    ),
    child: Center(
      child: Text(
        &#39;Tap me&#39;,
        style: TextStyle(color: Colors.white),
      ),
    ),
  ),
)
</code></pre><p>두 위젯을 비교해 보면, 상황과 요구 사항에 따라 어떤 위젯을 선택할지 결정할 수 있습니다. MaterialApp을 사용하는 경우 머티리얼 디자인 가이드라인을 따르는 것이 좋으므로 InkWell을 사용하는 것이 좋습니다. 하지만 더 많은 제스처를 처리하거나 시각적 효과가 필요하지 않은 경우에는 GestureDetector를 사용하면 됩니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Visibility 뭐야]]></title>
            <link>https://velog.io/@master_choi/Visibility-%EB%AD%90%EC%95%BC</link>
            <guid>https://velog.io/@master_choi/Visibility-%EB%AD%90%EC%95%BC</guid>
            <pubDate>Tue, 11 Apr 2023 10:03:27 GMT</pubDate>
            <description><![CDATA[<p>Visibility는 Flutter의 UI 프레임워크에서 사용되는 위젯입니다. 이 위젯은 자식 위젯의 가시성을 제어할 수 있는 방법을 제공합니다. Visibility 위젯은 주로 다음 세 가지 속성을 사용하여 자식 위젯의 가시성을 조절합니다.</p>
<p>visible: 이 속성은 true 또는 false 값으로 설정됩니다. true로 설정하면 자식 위젯이 화면에 표시되고, false로 설정하면 자식 위젯이 숨겨집니다.
replacement: 이 속성은 visible이 false일 때 표시할 위젯을 지정합니다. 기본값은 const SizedBox.shrink()입니다. 이렇게 하면 자식 위젯이 화면에서 제거되고 공간도 차지하지 않게 됩니다.
maintainState: 이 속성은 true 또는 false 값으로 설정됩니다. true로 설정하면 자식 위젯의 상태를 유지하며, false로 설정하면 가시성이 변경될 때 위젯의 상태가 소멸됩니다. 기본값은 false입니다.
예를 들어, Visibility 위젯을 사용하여 특정 조건에 따라 텍스트 위젯을 표시하거나 숨기는 방법은 다음과 같습니다.</p>
<pre><code>Visibility(
  visible: _isVisible, // _isVisible 변수에 따라 위젯의 가시성이 결정됩니다.
  child: Text(&quot;Hello, World!&quot;),
)
</code></pre><p>여기서 _isVisible는 bool 타입의 변수로, true 또는 false 값을 가질 수 있습니다. 이 값에 따라 텍스트 위젯이 표시되거나 숨겨집니다.
Visibility 위젯을 사용하는 다른 예를 살펴봅시다. 이 예제에서는 &#39;Show/Hide&#39; 버튼을 사용하여 텍스트 위젯의 가시성을 전환합니다.</p>
<p>먼저, Flutter 앱의 기본 구조를 생성합니다.</p>
<pre><code>import &#39;package:flutter/material.dart&#39;;

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text(&quot;Visibility Example&quot;)),
        body: MyHomePage(),
      ),
    );
  }
}
</code></pre><p>다음으로, StatefulWidget을 사용하여 MyHomePage 클래스를 정의하고, _isVisible 변수와 showHideText() 함수를 추가합니다. 이 함수는 &#39;Show/Hide&#39; 버튼이 클릭될 때 호출되어 텍스트 위젯의 가시성을 전환합니다.</p>
<pre><code>class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() =&gt; _MyHomePageState();
}

class _MyHomePageState extends State&lt;MyHomePage&gt; {
  bool _isVisible = true;

  void showHideText() {
    setState(() {
      _isVisible = !_isVisible;
    });
  }
</code></pre><p>그런 다음, build 메서드에서 Column 위젯을 사용하여 &#39;Show/Hide&#39; 버튼과 Visibility 위젯을 구성합니다.</p>
<pre><code>  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Visibility(
            visible: _isVisible,
            child: Text(&quot;This text can be hidden or shown.&quot;),
          ),
          SizedBox(height: 20),
          ElevatedButton(
            onPressed: showHideText,
            child: Text(&quot;Show/Hide&quot;),
          ),
        ],
      ),
    );
  }
}
</code></pre><p>이제 앱을 실행하면 &#39;Show/Hide&#39; 버튼을 사용하여 텍스트 위젯의 가시성을 전환할 수 있습니다. 이렇게 하면 사용자와 상호 작용하면서 동적으로 위젯의 가시성을 제어할 수 있습니다.</p>
<p>코드 전체는 다음과 같습니다.</p>
<pre><code>import &#39;package:flutter/material.dart&#39;;

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text(&quot;Visibility Example&quot;)),
        body: MyHomePage(),
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() =&gt; _MyHomePageState();
}

class _MyHomePageState extends State&lt;MyHomePage&gt; {
  bool _isVisible = true;

  void showHideText() {
    setState(() {
      _isVisible = !_isVisible;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Visibility(
            visible: _isVisible,
            child: Text(&quot;This text can be hidden or shown.&quot;),
          ),
          SizedBox(height: 20),
          ElevatedButton(
            onPressed: showHideText,
            child: Text(&quot;Show/Hide&quot;),
          ),
        ],
      ),
    );
  }
}
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[MainAxisSize 뭐야]]></title>
            <link>https://velog.io/@master_choi/MainAxisSize-%EB%AD%90%EC%95%BC</link>
            <guid>https://velog.io/@master_choi/MainAxisSize-%EB%AD%90%EC%95%BC</guid>
            <pubDate>Tue, 11 Apr 2023 09:40:07 GMT</pubDate>
            <description><![CDATA[<p>MainAxisSize는 Flutter 프레임워크의 RenderFlex 레이아웃에서 주 축(main axis)의 사용 가능한 공간을 어떻게 처리할지 결정하는 열거형(enumeration)입니다. 이것은 주로 Column과 Row 위젯에서 사용됩니다.</p>
<p>MainAxisSize에는 두 가지 값이 있습니다:</p>
<p>MainAxisSize.min: 이 옵션은 주 축(main axis)에 따라 자식 위젯들의 합계만큼 공간을 차지하도록 만듭니다. 예를 들어, Column에서 자식 위젯들의 총 높이만큼만 공간을 차지하게 됩니다.
MainAxisSize.max: 이 옵션은 주 축(main axis)에 따라 가능한 모든 공간을 차지하도록 만듭니다. 예를 들어, Column에서 사용 가능한 전체 높이를 차지하게 됩니다.
Column과 Row 위젯에서 mainAxisSize 속성을 사용하여 이 값을 설정할 수 있습니다. 예를 들면:</p>
<pre><code>Column(
  mainAxisSize: MainAxisSize.min,
  children: [
    Text(&#39;Hello, World!&#39;),
    Text(&#39;Flutter is awesome!&#39;),
  ],
)
</code></pre><p>위의 코드는 Column의 주 축(main axis) 크기를 자식 위젯들의 합계만큼만 차지하도록 설정합니다.</p>
<p>MainAxisSize에 대해 이해하려면 먼저 Flutter의 레이아웃 방식을 이해해야 합니다. Flutter 레이아웃에서 가장 중요한 두 축은 주 축(main axis)과 교차 축(cross axis)입니다. 이 두 축은 위젯의 방향과 크기를 결정합니다.</p>
<p>Column과 Row 위젯은 Flex-based 위젯이며, 각각 세로와 가로 방향의 주 축(main axis)을 가집니다. Column의 경우 주 축은 세로 방향이고, Row의 경우 주 축은 가로 방향입니다. 이러한 위젯을 사용하여 여러 자식 위젯을 배치할 수 있습니다.</p>
<p>MainAxisSize 설정을 사용하면 주 축(main axis)에 따라 자식 위젯의 공간 차지 방식을 결정할 수 있습니다. 아래에 추가 예시를 제공하겠습니다.</p>
<p>MainAxisSize.min 사용하기:</p>
<pre><code>Column(
  mainAxisSize: MainAxisSize.min,
  children: [
    Text(&#39;This is a line of text.&#39;),
    Text(&#39;This is another line of text.&#39;),
  ],
)
</code></pre><p>이 예제에서 Column의 주 축(main axis) 크기는 자식 위젯들의 총 높이와 같아집니다. 자식 위젯들이 차지하는 최소한의 공간만 사용하게 됩니다.</p>
<p>MainAxisSize.max 사용하기:</p>
<pre><code>Column(
  mainAxisSize: MainAxisSize.max,
  children: [
    Text(&#39;This is a line of text.&#39;),
    Text(&#39;This is another line of text.&#39;),
  ],
)
</code></pre><p>이 예제에서 Column의 주 축(main axis) 크기는 사용 가능한 모든 공간을 차지하게 됩니다. 자식 위젯들 사이에 공간이 남아있을 수 있습니다.</p>
<p>MainAxisSize를 이용하면 위젯의 배치를 더욱 유연하게 조정할 수 있으며, 애플리케이션의 디자인과 사용성을 개선할 수 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[flutter 한글폰트 사용하기]]></title>
            <link>https://velog.io/@master_choi/flutter-%ED%95%9C%EA%B8%80%ED%8F%B0%ED%8A%B8-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@master_choi/flutter-%ED%95%9C%EA%B8%80%ED%8F%B0%ED%8A%B8-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0</guid>
            <pubDate>Tue, 11 Apr 2023 08:04:56 GMT</pubDate>
            <description><![CDATA[<p>Flutter에서 한글 폰트를 사용하려면 다음과 같은 단계를 수행해야 합니다.</p>
<p>한글 폰트 파일 준비
먼저 사용하려는 한글 폰트 파일을 준비해야 합니다. TTF 또는 OTF 형식의 파일을 사용할 수 있습니다. 예를 들어, 무료로 사용할 수 있는 &#39;나눔 고딕&#39; 폰트를 사용하려면 나눔 고딕의 TTF 파일을 다운로드하세요.</p>
<p>프로젝트에 폰트 파일 추가
다운로드한 폰트 파일을 프로젝트의 폴더 내에 추가해야 합니다. &#39;fonts&#39;라는 새로운 폴더를 생성한 다음, 폰트 파일을 이 폴더에 넣으세요.</p>
<p>프로젝트 구조는 다음과 같이 보일 것입니다:</p>
<pre><code>my_flutter_project/
  fonts/
    NanumGothic.ttf
  lib/
  pubspec.yaml
</code></pre><p>pubspec.yaml 파일에 폰트 추가
프로젝트의 pubspec.yaml 파일을 열어 다음과 같이 &#39;fonts&#39; 섹션에 폰트를 추가하세요.</p>
<pre><code>flutter:
  uses-material-design: true
  fonts:
    - family: NanumGothic
      fonts:
        - asset: fonts/NanumGothic.ttf
</code></pre><p>앱에서 폰트 사용
이제 앱에서 한글 폰트를 사용할 수 있습니다. 예를 들어, 텍스트 스타일을 변경하여 새로운 폰트를 적용할 수 있습니다.</p>
<pre><code>import &#39;package:flutter/material.dart&#39;;

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text(&#39;한글 폰트 사용 예제&#39;)),
        body: Center(
          child: Text(
            &#39;안녕하세요! 나눔고딕 폰트를 사용 중입니다.&#39;,
            style: TextStyle(
              fontSize: 24,
              fontFamily: &#39;NanumGothic&#39;,
            ),
          ),
        ),
      ),
    );
  }
}
</code></pre><p>위의 예제에서 &#39;NanumGothic&#39;이라는 이름으로 폰트를 사용하고 있습니다. 이제 앱에서 한글 폰트가 적용된 것을 확인할 수 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[색상값 class 만들려면]]></title>
            <link>https://velog.io/@master_choi/%EC%83%89%EC%83%81%EA%B0%92-class-%EB%A7%8C%EB%93%A4%EB%A0%A4%EB%A9%B4</link>
            <guid>https://velog.io/@master_choi/%EC%83%89%EC%83%81%EA%B0%92-class-%EB%A7%8C%EB%93%A4%EB%A0%A4%EB%A9%B4</guid>
            <pubDate>Tue, 11 Apr 2023 06:42:20 GMT</pubDate>
            <description><![CDATA[<p>Flutter에서 색상값 클래스를 만들려면 Color 클래스를 확장하면 됩니다. 예를 들어, 다음과 같이 색상 값을 나타내는 MyColor 클래스를 만들 수 있습니다.</p>
<pre><code>import &#39;package:flutter/material.dart&#39;;

class MyColor extends Color {
  const MyColor(int value) : super(value);

  static const Color myColor1 = const Color(0xFFE1F5FE);
  static const Color myColor2 = const Color(0xFF90CAF9);
  static const Color myColor3 = const Color(0xFF2196F3);
}
</code></pre><p>위의 코드에서 MyColor 클래스는 Color 클래스를 상속받습니다. const MyColor(int value) : super(value)는 MyColor 클래스의 생성자입니다. 이 생성자는 부모 클래스 Color 클래스의 생성자를 호출하며, 인자로 전달받은 value를 사용하여 색상 값을 초기화합니다.</p>
<p>MyColor 클래스에서 static const으로 선언된 myColor1, myColor2, myColor3는 클래스 멤버 변수로 선언되었습니다. 이들은 해당 색상 값을 나타냅니다. 이렇게 클래스 멤버 변수로 선언하면, 코드의 여러 부분에서 쉽게 사용할 수 있습니다.</p>
<p>MyColor 클래스를 사용하는 방법은 다음과 같습니다.</p>
<pre><code>import &#39;package:flutter/material.dart&#39;;

import &#39;my_color.dart&#39;;

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: &#39;My App&#39;,
      home: Scaffold(
        backgroundColor: MyColor.myColor1,
        appBar: AppBar(
          backgroundColor: MyColor.myColor2,
          title: Text(&#39;My App&#39;),
        ),
        body: Center(
          child: Container(
            color: MyColor.myColor3,
            child: Text(
              &#39;Hello, world!&#39;,
              style: TextStyle(
                color: Colors.white,
              ),
            ),
          ),
        ),
      ),
    );
  }
}
</code></pre><p>위의 코드에서 MyColor 클래스는 my_color.dart 파일에 정의되어 있습니다. 이 파일은 import 문으로 가져옵니다.</p>
<p>위 코드에서 MyColor.myColor1, MyColor.myColor2, MyColor.myColor3은 각각 클래스 멤버 변수 myColor1, myColor2, myColor3의 값을 나타냅니다. 이 값을 backgroundColor 또는 color와 같은 속성에 지정하여, 해당 색상으로 화면을 구성할 수 있습니다.</p>
<p>위와 같이 색상 값을 클래스로 관리하면, 여러 곳에서 같은 색상을 사용할 때 일관성을 유지할 수 있습니다. 또한, 색상 값을 변경할 때는 클래스 멤버 변수의 값을 수정하기만 하면 되므로, 코드를 변경하기 쉽고 유지보수도 용이합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[flutter NestedRoute 뭐야]]></title>
            <link>https://velog.io/@master_choi/flutter-NestedRoute-%EB%AD%90%EC%95%BC</link>
            <guid>https://velog.io/@master_choi/flutter-NestedRoute-%EB%AD%90%EC%95%BC</guid>
            <pubDate>Tue, 11 Apr 2023 05:54:51 GMT</pubDate>
            <description><![CDATA[<p>NestedRoute는 Flutter에서 라우트(route)를 중첩(nested)하여 사용하는 방식을 말합니다. 이는 앱 내에서 독립적인 라우트 구조를 구성할 때 유용하며, 주로 복잡한 앱 내비게이션 구조를 관리하기 위해 사용됩니다.</p>
<p>GoRouter는 Flutter에서 사용되는 라우팅 라이브러리 중 하나로, 강력한 기능과 쉬운 사용법으로 인기가 높아졌습니다. 여기에서는 GoRouter를 이용하여 Flutter에서 Nested Route를 구현하는 방법에 대해 설명하겠습니다.</p>
<p>필요한 패키지를 추가하세요.
pubspec.yaml 파일에서 다음과 같이 go_router 패키지를 추가합니다:</p>
<pre><code>dependencies:
  flutter:
    sdk: flutter
  go_router: ^2.4.2
</code></pre><p>모델 및 페이지를 생성하세요.
간단한 예제를 위해 두 개의 페이지를 생성합니다. Home 페이지는 메인 화면이며, Details 페이지는 내부 페이지입니다.</p>
<pre><code>// home_page.dart
import &#39;package:flutter/material.dart&#39;;

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text(&#39;Home&#39;)),
      body: const Center(child: Text(&#39;Welcome to the Home Page&#39;)),
    );
  }
}

// details_page.dart
import &#39;package:flutter/material.dart&#39;;

class DetailsPage extends StatelessWidget {
  final String id;

  const DetailsPage({required this.id, Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text(&#39;Details&#39;)),
      body: Center(child: Text(&#39;Details for item $id&#39;)),
    );
  }
}
</code></pre><p>GoRouter를 설정하세요.
GoRouter를 사용하여 Nested Route를 구성하려면 GoRoute 객체를 정의하고 초기화해야 합니다.</p>
<pre><code>import &#39;package:flutter/material.dart&#39;;
import &#39;package:go_router/go_router.dart&#39;;
import &#39;home_page.dart&#39;;
import &#39;details_page.dart&#39;;

void main() {
  final goRouter = GoRouter(
    routes: [
      GoRoute(
        path: &#39;/&#39;,
        pageBuilder: (context, state) {
          return MaterialPage(child: HomePage());
        },
        children: [
          GoRoute(
            path: &#39;details/:id&#39;,
            pageBuilder: (context, state) {
              final id = state.params[&#39;id&#39;];
              return MaterialPage(child: DetailsPage(id: id));
            },
          ),
        ],
      ),
    ],
  );

  runApp(MyApp(goRouter: goRouter));
}

class MyApp extends StatelessWidget {
  final GoRouter goRouter;

  MyApp({required this.goRouter});

  @override
  Widget build(BuildContext context) {
    return MaterialApp.router(
      routerDelegate: goRouter.routerDelegate,
      routeInformationParser: goRouter.routeInformationParser,
    );
  }
}
</code></pre><p>위의 예제에서는 루트 경로(/)에 HomePage를 할당하고, DetailsPage를 자식 라우트로 설정하여 중첩 라우팅 구조를 만들었습니다. 이렇게 하면 HomePage의 내부에서 DetailsPage로 이동할 수 있게 됩니다.</p>
<p>페이지 간 이동
HomePage에서 DetailsPage로 이동하기 위해 다음과 같이 GoRouter를 사용하여 이동을 처리할 수 있습니다.</p>
<pre><code>// home_page.dart
import &#39;package:flutter/material.dart&#39;;
import &#39;package:go_router/go_router.dart&#39;;

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
  final goRouter = GoRouter.of(context);
  return Scaffold(
  appBar: AppBar(title: const Text(&#39;Home&#39;)),
  body: Center(
    child: Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        const Text(&#39;Welcome to the Home Page&#39;),
        ElevatedButton(
          onPressed: () {
            goRouter.go(&#39;/details/1&#39;);
          },
          child: const Text(&#39;Go to Details Page&#39;),
        ),
      ],
    ),
  ),
);
}
}</code></pre><p>위의 코드에서는 <code>ElevatedButton</code> 위젯을 추가하여 사용자가 버튼을 클릭하면 <code>DetailsPage</code>로 이동하도록 했습니다. <code>goRouter.go</code> 메소드를 사용하여 라우팅 경로를 전달하고 이동을 처리했습니다.</p>
<p>이제 앱을 실행하면 <code>HomePage</code>에 버튼이 표시되고, 해당 버튼을 클릭하면 <code>DetailsPage</code>로 이동합니다. 이 방법으로 <code>GoRouter</code>를 사용하여 Flutter에서 Nested Route를 구현할 수 있습니다. 이제 여러 레벨의 중첩된 라우트를 추가하거나 필요한 매개 변수를 전달하여 라우팅 구조를 더욱 강화할 수 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[navigatorKey가 뭐야]]></title>
            <link>https://velog.io/@master_choi/navigatorKey%EA%B0%80-%EB%AD%90%EC%95%BC</link>
            <guid>https://velog.io/@master_choi/navigatorKey%EA%B0%80-%EB%AD%90%EC%95%BC</guid>
            <pubDate>Mon, 10 Apr 2023 11:29:26 GMT</pubDate>
            <description><![CDATA[<p>navigatorKey는 Flutter에서 사용되는 GlobalKey 객체로, Navigator 위젯에 대한 고유한 참조를 제공합니다. GlobalKey는 전역으로 고유하게 식별되는 키로, Flutter 위젯 트리 전체에서 사용할 수 있습니다. Navigator는 앱에서 화면 간 이동(네비게이션)을 관리하는 위젯입니다.</p>
<p>navigatorKey를 사용하면 Navigator에 대한 직접 참조를 얻을 수 있으므로, 앱 전체에서 화면 이동을 수행할 수 있습니다. 예를 들어, 앱의 깊숙한 곳에서 있는 위젯이나, 이벤트 핸들러에서 화면 이동을 수행해야 할 때 navigatorKey를 사용할 수 있습니다.</p>
<p>navigatorKey를 사용하는 방법은 다음과 같습니다:</p>
<p>GlobalKey 객체를 생성합니다.</p>
<pre><code>final GlobalKey&lt;NavigatorState&gt; navigatorKey = GlobalKey&lt;NavigatorState&gt;();
</code></pre><p>MaterialApp이나 MaterialApp 위젯에 navigatorKey를 설정합니다.</p>
<pre><code>MaterialApp(
  navigatorKey: navigatorKey,
  // ...
);
</code></pre><p>이제 navigatorKey를 사용하여 앱 전체에서 Navigator에 접근할 수 있습니다.</p>
<pre><code>navigatorKey.currentState.pushNamed(&#39;/yourRouteName&#39;);
</code></pre><p>이렇게 하면, 앱의 다양한 위치에서 네비게이션을 제어할 수 있게 됩니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[ gorouter에서 ShellRoute,NestedRoute 뭐야]]></title>
            <link>https://velog.io/@master_choi/gorouter%EC%97%90%EC%84%9C-ShellRouteNestedRoute-%EB%AD%90%EC%95%BC</link>
            <guid>https://velog.io/@master_choi/gorouter%EC%97%90%EC%84%9C-ShellRouteNestedRoute-%EB%AD%90%EC%95%BC</guid>
            <pubDate>Mon, 10 Apr 2023 11:15:11 GMT</pubDate>
            <description><![CDATA[<p>Flutter의 GoRouter 패키지는 애플리케이션 내에서 라우팅 및 탐색을 처리하는 데 사용되는 라이브러리입니다. 이 라이브러리에서 ShellRoute와 NestedRoute는 라우트 구성의 다른 형태입니다.</p>
<p>ShellRoute:
ShellRoute는 라우트 구조의 상위 수준을 나타냅니다. 여기서 셸이라는 용어는 앱의 골격 또는 전체 레이아웃을 의미합니다. 이 레이아웃은 일반적으로 앱 바, 탭 바, 드로어 등과 같은 공통 UI 요소를 포함합니다. ShellRoute를 사용하여 공통 요소를 공유하는 하위 페이지를 그룹화할 수 있습니다.
예를 들어, 다음과 같이 ShellRoute를 사용하여 앱의 메인 섹션을 정의할 수 있습니다.</p>
<pre><code>GoRoute(
  path: &#39;/main&#39;,
  pageBuilder: (context, state) =&gt; MaterialPage(child: MainLayout()),
  routes: [
    // Nested routes go here
  ],
),
</code></pre><p>NestedRoute:
NestedRoute는 ShellRoute 내에서 정의된 하위 라우트를 나타냅니다. 이 라우트는 ShellRoute에 정의된 공통 레이아웃 내에서 페이지를 표시하는 데 사용됩니다. NestedRoute를 사용하여 ShellRoute의 일부인 페이지들을 정의할 수 있습니다.
예를 들어, 다음과 같이 NestedRoute를 사용하여 메인 섹션 내에서 여러 페이지를 정의할 수 있습니다.</p>
<pre><code>GoRoute(
  path: &#39;/main&#39;,
  pageBuilder: (context, state) =&gt; MaterialPage(child: MainLayout()),
  routes: [
    GoRoute(
      path: &#39;dashboard&#39;,
      pageBuilder: (context, state) =&gt; MaterialPage(child: DashboardPage()),
    ),
    GoRoute(
      path: &#39;profile&#39;,
      pageBuilder: (context, state) =&gt; MaterialPage(child: ProfilePage()),
    ),
  ],
),
</code></pre><p>이 예에서, /main/dashboard 및 /main/profile 경로로 탐색할 때 앱은 공통 레이아웃(MainLayout) 내에서 대시보드 및 프로필 페이지를 각각 표시합니다. 이 방식으로 ShellRoute와 NestedRoute를 함께 사용하여 계층적인 라우트 구조를 구성할 수 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[dart언어에서 변수명앞에 '_'를 붙이는 이유가 뭐야

]]></title>
            <link>https://velog.io/@master_choi/dart%EC%96%B8%EC%96%B4%EC%97%90%EC%84%9C-%EB%B3%80%EC%88%98%EB%AA%85%EC%95%9E%EC%97%90-%EB%A5%BC-%EB%B6%99%EC%9D%B4%EB%8A%94-%EC%9D%B4%EC%9C%A0%EA%B0%80-%EB%AD%90%EC%95%BC</link>
            <guid>https://velog.io/@master_choi/dart%EC%96%B8%EC%96%B4%EC%97%90%EC%84%9C-%EB%B3%80%EC%88%98%EB%AA%85%EC%95%9E%EC%97%90-%EB%A5%BC-%EB%B6%99%EC%9D%B4%EB%8A%94-%EC%9D%B4%EC%9C%A0%EA%B0%80-%EB%AD%90%EC%95%BC</guid>
            <pubDate>Mon, 10 Apr 2023 11:08:28 GMT</pubDate>
            <description><![CDATA[<p>Dart 언어에서 변수명 앞에 &#39;_&#39;를 붙이는 것은 일반적으로 해당 변수가 해당 파일에서만 사용되고, 파일 외부에서는 직접 접근해서 사용하지 않아야 함을 나타내는 관례입니다. 이것을 &quot;private 변수&quot;라고도 부릅니다.</p>
<p>Dart 언어에서는 변수나 함수 이름 앞에 &#39;_&#39;를 붙이면 해당 식별자는 라이브러리 외부에서 접근할 수 없는 &quot;라이브러리 프라이빗&quot;으로 취급됩니다. 이것은 다른 라이브러리나 애플리케이션에서 해당 식별자를 실수로 사용하거나, 해당 식별자의 동작이 변경될 때 다른 코드에 미치는 영향을 최소화하기 위한 목적으로 사용됩니다.</p>
<p>그러나 &#39;_&#39;는 암묵적인 관례일 뿐이며, 실제로 해당 변수나 함수를 완전히 보호하지 않습니다. 다른 파일에서 해당 변수나 함수를 import하거나, 리플렉션을 사용하면 여전히 접근할 수 있습니다. 따라서 실제 보안성을 강화하기 위해서는 다른 방법을 사용해야 합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[flutter statelessful 와 stateful 비교]]></title>
            <link>https://velog.io/@master_choi/flutter-statelessful-%EC%99%80-stateful-%EB%B9%84%EA%B5%90</link>
            <guid>https://velog.io/@master_choi/flutter-statelessful-%EC%99%80-stateful-%EB%B9%84%EA%B5%90</guid>
            <pubDate>Mon, 10 Apr 2023 11:06:09 GMT</pubDate>
            <description><![CDATA[<p>Flutter에서 위젯은 두 가지 유형으로 구분됩니다. StatelessWidget와 StatefulWidget입니다.</p>
<p>StatelessWidget
StatelessWidget은 변경 불가능한 위젯입니다. 즉, 한번 생성되면 상태가 변하지 않습니다. 이러한 위젯은 보통 화면에 표시되는 간단한 위젯, 예를 들어 텍스트, 이미지, 버튼 등의 위젯에 사용됩니다.</p>
<p>StatelessWidget은 한번 생성되면 build() 메서드를 호출하여 위젯을 생성합니다. 이후에는 상태가 변하지 않으므로, 다시 build() 메서드가 호출되지 않습니다. 즉, 한번 생성된 위젯은 메모리를 차지하지만, 상태가 변하지 않으므로 성능에 미치는 영향은 적습니다.</p>
<pre><code>class MyTextWidget extends StatelessWidget {
  final String text;

  MyTextWidget({required this.text});

  @override
  Widget build(BuildContext context) {
    return Text(text);
  }
}
</code></pre><p>StatefulWidget
StatefulWidget은 변경 가능한 위젯입니다. 이러한 위젯은 보통 사용자 입력을 처리하거나, 동적인 UI를 구성하는데 사용됩니다.</p>
<p>StatefulWidget은 State 객체와 연결되어 있습니다. State 객체는 위젯의 상태를 나타내며, StatefulWidget의 build() 메서드에서 생성된 위젯에 변화를 줄 수 있습니다.</p>
<p>StatefulWidget은 생성 시점에 createState() 메서드를 호출하여 State 객체를 생성합니다. State 객체는 이후에 build() 메서드에서 변경 사항이 발생할 때마다 업데이트됩니다.</p>
<pre><code>class MyCounterWidget extends StatefulWidget {
  @override
  _MyCounterWidgetState createState() =&gt; _MyCounterWidgetState();
}

class _MyCounterWidgetState extends State&lt;MyCounterWidget&gt; {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: &lt;Widget&gt;[
        Text(&#39;Counter:&#39;, style: TextStyle(fontSize: 24)),
        Text(
          &#39;$_counter&#39;,
          style: TextStyle(fontSize: 36, fontWeight: FontWeight.bold),
        ),
        ElevatedButton(
          onPressed: _incrementCounter,
          child: Text(&#39;Increment&#39;),
        ),
      ],
    );
  }
}
</code></pre><p>결론적으로, StatelessWidget은 변경 불가능한 위젯으로, 한번 생성되면 상태가 변하지 않습니다. StatefulWidget은 변경 가능한 위젯으로, State 객체와 함께 동작하여 상태가 변경될 때마다 build() 메서드를 호출하여 UI를 업데이트합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Mediaquery vs Layoutbuilder에 대해 비교]]></title>
            <link>https://velog.io/@master_choi/Mediaquery-vs-Layoutbuilder%EC%97%90-%EB%8C%80%ED%95%B4-%EB%B9%84%EA%B5%90</link>
            <guid>https://velog.io/@master_choi/Mediaquery-vs-Layoutbuilder%EC%97%90-%EB%8C%80%ED%95%B4-%EB%B9%84%EA%B5%90</guid>
            <pubDate>Mon, 10 Apr 2023 11:04:17 GMT</pubDate>
            <description><![CDATA[<p>Flutter에서는 레이아웃 구성을 위해 MediaQuery와 LayoutBuilder라는 두 가지 유틸리티 클래스가 제공됩니다.</p>
<p>MediaQuery는 현재 장치의 미디어 쿼리 정보를 제공하는 클래스입니다. 이 클래스를 사용하면 현재 디바이스의 크기, 방향, 해상도 등과 같은 정보를 얻을 수 있습니다. 이 정보를 사용하여 레이아웃을 조정하고, 반응형 디자인을 구현할 수 있습니다.</p>
<p>예를 들어, 다음 코드는 현재 디바이스의 높이와 너비를 출력하는 방법을 보여줍니다.</p>
<pre><code>void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final Size screenSize = MediaQuery.of(context).size;
    final double screenHeight = screenSize.height;
    final double screenWidth = screenSize.width;

    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: Text(&#39;Screen width: $screenWidth\nScreen height: $screenHeight&#39;),
        ),
      ),
    );
  }
}
</code></pre><p>LayoutBuilder는 위젯의 크기 및 위치 정보를 제공하는 클래스입니다. 이 클래스를 사용하면 부모 위젯의 크기가 변경될 때마다 자식 위젯의 레이아웃을 조정할 수 있습니다.</p>
<p>예를 들어, 다음 코드는 부모 위젯의 너비와 높이를 출력하는 방법을 보여줍니다.</p>
<pre><code>void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: LayoutBuilder(
          builder: (BuildContext context, BoxConstraints constraints) {
            final double height = constraints.maxHeight;
            final double width = constraints.maxWidth;
            return Center(
              child: Text(&#39;Parent width: $width\nParent height: $height&#39;),
            );
          },
        ),
      ),
    );
  }
}
</code></pre><p>결론적으로, MediaQuery는 현재 디바이스의 미디어 쿼리 정보를 제공하며, LayoutBuilder는 부모 위젯의 크기 정보를 제공합니다. 두 클래스를 사용하여 반응형 디자인을 구현하고 레이아웃을 조정할 수 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[class의 캡슐화는 어떤 의미]]></title>
            <link>https://velog.io/@master_choi/class%EC%9D%98-%EC%BA%A1%EC%8A%90%ED%99%94%EB%8A%94-%EC%96%B4%EB%96%A4-%EC%9D%98%EB%AF%B8</link>
            <guid>https://velog.io/@master_choi/class%EC%9D%98-%EC%BA%A1%EC%8A%90%ED%99%94%EB%8A%94-%EC%96%B4%EB%96%A4-%EC%9D%98%EB%AF%B8</guid>
            <pubDate>Mon, 10 Apr 2023 11:00:09 GMT</pubDate>
            <description><![CDATA[<p>캡슐화(Encapsulation)는 객체 지향 프로그래밍(Object-Oriented Programming, OOP)에서 중요한 개념 중 하나로, 데이터와 함수를 하나의 클래스로 묶어서 관리하는 것을 의미합니다. 캡슐화를 통해 코드의 구조를 개선하고, 유지보수와 확장이 용이하도록 도와줍니다.</p>
<p>캡슐화의 주요 목적은 다음과 같습니다:</p>
<p>데이터 은닉(Data Hiding): 클래스 내부의 데이터를 외부로부터 숨기고, 클래스 외부에서는 이 데이터에 접근할 수 없도록 만듭니다. 이를 통해 클래스 내부의 데이터를 보호하고, 외부에서의 잘못된 접근으로 인한 오류를 방지할 수 있습니다.</p>
<p>추상화(Abstraction): 캡슐화를 통해 클래스는 외부에 간단한 인터페이스를 제공하고, 내부 구현은 숨겨집니다. 이를 통해 사용자는 클래스의 복잡한 내부 구조를 몰라도 사용할 수 있으며, 클래스의 작동 방식에 집중할 수 있습니다.</p>
<p>코드 재사용성(Code Reusability): 클래스를 통해 관련된 데이터와 함수를 하나의 단위로 묶음으로써, 해당 클래스를 다른 프로젝트나 다른 부분에서 쉽게 재사용할 수 있습니다. 이를 통해 중복 코드를 줄이고 개발 효율성을 높일 수 있습니다.</p>
<p>캡슐화를 사용하여 클래스를 구성함으로써 코드의 구조와 가독성이 향상되며, 프로젝트의 유지보수와 확장성이 개선됩니다. 이를 통해 효율적인 객체 지향 프로그래밍을 구현할 수 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[flutter에서 widget, function,class 의 차이점]]></title>
            <link>https://velog.io/@master_choi/flutter%EC%97%90%EC%84%9C-widget-functionclass-%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90</link>
            <guid>https://velog.io/@master_choi/flutter%EC%97%90%EC%84%9C-widget-functionclass-%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90</guid>
            <pubDate>Mon, 10 Apr 2023 10:59:48 GMT</pubDate>
            <description><![CDATA[<p>Flutter에서 Widget, Function, Class는 모두 애플리케이션 개발에 사용되는 핵심 개념들입니다. 각각의 차이점은 다음과 같습니다:</p>
<p>Widget:
Flutter에서 Widget은 애플리케이션의 기본 구성 요소입니다. Widget은 화면에 나타나는 모든 것들을 나타내며, 사용자 인터페이스를 구성하는 요소입니다. 예를 들어, 텍스트, 버튼, 이미지, 슬라이더 등 모든 것이 Widget입니다. Flutter에서는 대부분의 경우에 StatelessWidget과 StatefulWidget의 두 가지 유형의 Widget이 존재합니다. StatelessWidget은 한 번 생성되면 변경되지 않는 Widget이고, StatefulWidget은 상태를 가지며 시간에 따라 변경될 수 있는 Widget입니다.</p>
<p>Function:
Function(함수)는 코드를 재사용하기 위해 사용되며, 하나 이상의 작업을 수행하는 일련의 명령문을 그룹화합니다. 함수는 입력 매개변수를 받아들이고, 결과를 반환할 수 있습니다. Flutter에서는 함수를 사용하여 Widget을 구축하거나, 이벤트 처리, 데이터 처리 등과 같은 기능을 수행할 수 있습니다.</p>
<p>Class:
Class(클래스)는 객체 지향 프로그래밍에서 사용되는 코드 구조의 기본 단위입니다. 클래스는 객체의 상태(속성)와 동작(메서드)을 정의합니다. Flutter에서 클래스는 주로 커스텀 Widget, 데이터 모델, 상태 관리 등을 위해 사용됩니다. 클래스를 사용하여 애플리케이션의 다양한 구성 요소를 캡슐화하고, 코드 재사용성과 가독성을 높일 수 있습니다.</p>
<p>요약하면, Flutter에서 Widget은 사용자 인터페이스를 구성하는 요소이며, Function은 코드를 그룹화하고 재사용하기 위한 방법이고, Class는 객체 지향 프로그래밍을 통해 코드를 구조화하고 캡슐화하는 데 사용됩니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[flutter 키워드]]></title>
            <link>https://velog.io/@master_choi/flutter-%ED%82%A4%EC%9B%8C%EB%93%9C</link>
            <guid>https://velog.io/@master_choi/flutter-%ED%82%A4%EC%9B%8C%EB%93%9C</guid>
            <pubDate>Mon, 10 Apr 2023 10:58:34 GMT</pubDate>
            <description><![CDATA[<p>lutter는 Google에서 개발한 오픈소스 UI 소프트웨어 개발 키트 (SDK)입니다. Dart라는 프로그래밍 언어를 사용하여, iOS와 Android 운영 체제를 위한 네이티브 앱을 빌드할 수 있습니다. 몇 가지 주요 Flutter 키워드를 살펴보겠습니다:</p>
<p>Widgets: Flutter에서 UI 구성 요소를 나타내는 데 사용되는 기본 빌딩 블록입니다. 모든 것은 위젯이며, 사용자 인터페이스를 구축하는 데 사용할 수 있는 다양한 종류의 위젯이 있습니다.</p>
<p>StatefulWidget: 상태를 가지고 있는 위젯으로, 상태가 변경될 때 위젯이 다시 빌드됩니다.</p>
<p>StatelessWidget: 상태를 가지고 있지 않은 위젯으로, 한 번 렌더링되면 변경되지 않습니다.</p>
<p>MaterialApp: Material Design 스타일의 기본 앱 구조를 제공하는 위젯입니다.</p>
<p>Scaffold: 앱의 기본 시각적 구조를 정의하는 데 사용되는 위젯입니다. AppBar, FloatingActionButton, Drawer 등과 같은 주요 레이아웃 요소를 포함할 수 있습니다.</p>
<p>AppBar: 앱의 상단에 표시되는 Material Design 앱 바를 구현하는 위젯입니다.</p>
<p>ListView: 스크롤 가능한 목록을 생성하는 위젯입니다.</p>
<p>GestureDetector: 사용자 입력(터치, 탭, 더블 탭, 드래그 등)을 감지하는 위젯입니다.</p>
<p>StatefulWidgetBuilder: 상태를 가지는 위젯의 빌더 메서드를 나타내는 데 사용되는 콜백입니다.</p>
<p>ThemeData: 앱의 전반적인 테마를 정의하는 데 사용되는 클래스입니다. 여기에는 글꼴, 색상, 버튼 스타일 등이 포함됩니다.</p>
<p>이러한 키워드들은 Flutter 앱 개발의 핵심 구성 요소입니다. Flutter는 빠르게 인기를 얻고 있으며, 그 덕분에 다양한 플랫폼에서 동일한 코드베이스로 높은 품질의 앱을 개발할 수 있게 되었습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[visualDensity 뭔가]]></title>
            <link>https://velog.io/@master_choi/visualDensity-%EB%AD%94%EA%B0%80</link>
            <guid>https://velog.io/@master_choi/visualDensity-%EB%AD%94%EA%B0%80</guid>
            <pubDate>Mon, 10 Apr 2023 10:55:15 GMT</pubDate>
            <description><![CDATA[<p>Flutter에서 visualDensity는 화면에 보이는 위젯들의 밀도와 관련이 있습니다. 이 속성은 위젯의 크기, 간격, 패딩 등의 값을 조정하여 화면에서 더 조밀하거나 덜 조밀하게 표시할 수 있습니다.</p>
<p>visualDensity의 값을 조정하면 위젯의 크기나 간격 등이 변하므로, 앱의 레이아웃이 바뀔 수 있습니다. 예를 들어, visualDensity 값을 높이면 위젯들이 더 조밀하게 배치되어 화면에서 더 많은 정보를 볼 수 있지만, 글씨 크기가 작아져서 가독성이 떨어질 수 있습니다.</p>
<p>visualDensity 속성은 MaterialApp 또는 Theme 위젯에서 설정할 수 있으며, 기본값은 null입니다. null일 경우, Flutter는 기본값으로 1.0을 사용합니다.</p>
<p>아래는 visualDensity 값을 설정하는 예시 코드입니다.</p>
<pre><code>return MaterialApp(
  title: &#39;Flutter Demo&#39;,
  theme: ThemeData(
    visualDensity: VisualDensity.adaptivePlatformDensity,
  ),
  home: MyHomePage(title: &#39;Flutter Demo Home Page&#39;),
);
</code></pre><p>위 코드에서는 adaptivePlatformDensity를 사용하여, 플랫폼마다 다른 visualDensity 값을 사용하도록 설정하고 있습니다. 이를 사용하면 iOS와 Android에서 각각 최적화된 visualDensity 값을 사용할 수 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[ScrollController 뭔가]]></title>
            <link>https://velog.io/@master_choi/ScrollController-%EB%AD%94%EA%B0%80</link>
            <guid>https://velog.io/@master_choi/ScrollController-%EB%AD%94%EA%B0%80</guid>
            <pubDate>Mon, 10 Apr 2023 08:10:44 GMT</pubDate>
            <description><![CDATA[<p>Flutter에서 ScrollController는 스크롤 가능한 위젯을 제어하는 데 사용되는 클래스입니다. ScrollController는 사용자가 스크롤을 수행할 때 위치 및 애니메이션 상태를 추적합니다. 이를 사용하여 스크롤 위치를 설정하거나 가져오거나, 스크롤 애니메이션을 시작하거나, 스크롤 가능한 위젯의 스크롤 상태를 수신하는 데 사용할 수 있습니다.</p>
<p>ScrollController는 ListView, GridView, SingleChildScrollView 등과 같은 스크롤 가능한 위젯에서 주로 사용됩니다. 기본적인 사용 방법은 다음과 같습니다:</p>
<p>ScrollController 인스턴스 생성:</p>
<pre><code>ScrollController _scrollController = ScrollController();
</code></pre><p>스크롤 가능한 위젯에 ScrollController 할당:</p>
<pre><code>ListView.builder(
  controller: _scrollController,
  itemCount: itemCount,
  itemBuilder: (BuildContext context, int index) {
    return ListTile(title: Text(&#39;Item $index&#39;));
  },
);
</code></pre><p>ScrollController를 사용하여 스크롤 위치 제어 및 상태 알림 수신:</p>
<pre><code>// 스크롤 위치 가져오기
double scrollPosition = _scrollController.position.pixels;

// 스크롤 위치 설정
_scrollController.jumpTo(newPosition);

// 애니메이션과 함께 스크롤 위치 설정
_scrollController.animateTo(
  newPosition,
  duration: Duration(milliseconds: 300),
  curve: Curves.easeInOut,
);

// 스크롤 상태에 대한 알림 수신
_scrollController.addListener(() {
  // 스크롤 위치, 애니메이션 상태 등에 대한 정보 처리
});
</code></pre><p>이러한 기능을 사용하여 자동 스크롤, 무한 스크롤, 페이징 등과 같은 다양한 스크롤 동작을 구현할 수 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[NavigatorState 뭔가]]></title>
            <link>https://velog.io/@master_choi/NavigatorState-%EB%AD%94%EA%B0%80</link>
            <guid>https://velog.io/@master_choi/NavigatorState-%EB%AD%94%EA%B0%80</guid>
            <pubDate>Mon, 10 Apr 2023 08:02:35 GMT</pubDate>
            <description><![CDATA[<p>NavigatorState는 Flutter의 Navigator 위젯의 상태를 나타내는 클래스입니다. Flutter에서 Navigator는 애플리케이션의 화면 전환을 관리합니다. Navigator는 위젯 트리를 사용하여 스택으로 앱의 화면을 구성하고, 앱의 탐색을 구현하기 위한 여러 메소드를 제공합니다.</p>
<p>NavigatorState는 다음과 같은 일반적인 메소드들을 포함합니다:</p>
<p>push(): 새로운 화면(Route)을 스택에 추가하고 화면 전환을 합니다.
pop(): 현재 화면을 스택에서 제거하고 이전 화면으로 돌아갑니다.
replace(): 스택의 현재 화면을 다른 화면으로 교체합니다.
pushNamed(): 미리 정의된 이름을 사용하여 스택에 새로운 화면을 추가하고 화면 전환을 합니다.
popAndPushNamed(): 현재 화면을 스택에서 제거하고 미리 정의된 이름을 사용하여 새로운 화면을 추가합니다.
이러한 메소드들은 앱의 화면 전환을 수행하거나 탐색 스택을 조작하는 데 사용됩니다. 주로 BuildContext를 사용하여 Navigator의 상태를 가져온 다음 해당 메소드를 호출하여 탐색을 수행합니다.</p>
<p>예를 들어, 기본적인 화면 전환은 다음과 같이 수행할 수 있습니다:</p>
<pre><code>Navigator.push(
  context,
  MaterialPageRoute(builder: (context) =&gt; SecondScreen()),
);
</code></pre><p>여기서 context는 현재의 BuildContext이며, SecondScreen()은 새로운 화면의 위젯입니다.</p>
<p>탐색을 처리하기 위해 Flutter에서 제공하는 Navigator와 관련된 주요 클래스들은 다음과 같습니다:</p>
<p>Route: 화면 전환을 나타내는 추상 클래스입니다. 주로 MaterialPageRoute와 같은 구체적인 구현을 사용하게 됩니다.
PageRoute: Route의 추상 서브 클래스로, 위젯 트리의 일부분을 나타내는 특정 경로입니다. 머티리얼 디자인에서는 MaterialPageRoute를 사용하며, Cupertino 디자인에서는 CupertinoPageRoute를 사용합니다.
Navigator: Route 객체를 관리하는 위젯입니다. Navigator는 일반적으로 앱의 전역 상태에 포함되며, 다양한 화면 전환을 제어할 수 있습니다.
다음은 기본적인 예제 코드입니다:</p>
<pre><code>import &#39;package:flutter/material.dart&#39;;

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: FirstScreen(),
    );
  }
}

class FirstScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text(&#39;First Screen&#39;)),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            Navigator.push(
              context,
              MaterialPageRoute(builder: (context) =&gt; SecondScreen()),
            );
          },
          child: Text(&#39;Go to Second Screen&#39;),
        ),
      ),
    );
  }
}

class SecondScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text(&#39;Second Screen&#39;)),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            Navigator.pop(context);
          },
          child: Text(&#39;Go back to First Screen&#39;),
        ),
      ),
    );
  }
}
</code></pre><p>이 예제에서 MyApp은 전체 앱의 루트 위젯이며, FirstScreen과 SecondScreen은 서로 다른 화면의 위젯입니다. ElevatedButton 위젯을 사용하여 각 화면에서 다른 화면으로 전환할 수 있습니다.</p>
<p>Navigator.push() 메소드를 사용하여 SecondScreen으로 이동하고, Navigator.pop() 메소드를 사용하여 FirstScreen으로 돌아갑니다. BuildContext는 이러한 메소드를 호출할 때 매개변수로 전달되며, 애플리케이션의 위젯 트리와 관련된 정보를 제공합니다.</p>
<p>이렇게 Flutter에서는 Navigator, Route, 그리고 관련 메소드들을 사용하여 앱의 화면 전환을 관리하고 탐색을 처리할 수 있습니다. 이를 통해 사용자가 앱 내에서 원활하게 이동할 수 있게 됩니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[extendBodyBehindAppBar 뭔가]]></title>
            <link>https://velog.io/@master_choi/extendBodyBehindAppBar-%EB%AD%94%EA%B0%80</link>
            <guid>https://velog.io/@master_choi/extendBodyBehindAppBar-%EB%AD%94%EA%B0%80</guid>
            <pubDate>Mon, 10 Apr 2023 07:44:29 GMT</pubDate>
            <description><![CDATA[<p>extendBodyBehindAppBar는 Flutter의 Scaffold 위젯에서 사용되는 속성입니다. 이 속성은 true로 설정되면, 스크롤 가능한 위젯이 AppBar 아래로 확장되어, AppBar을 투명하게 만들 수 있습니다. 이를 통해 더욱 독특한 디자인이 가능해집니다.</p>
<p>다음 예제를 참조해보세요:</p>
<pre><code>import &#39;package:flutter/material.dart&#39;;

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        extendBodyBehindAppBar: true,
        appBar: AppBar(
          backgroundColor: Colors.transparent,
          elevation: 0,
        ),
        body: ListView.builder(
          itemCount: 20,
          itemBuilder: (context, index) {
            return ListTile(
              title: Text(&#39;List Item $index&#39;),
            );
          },
        ),
      ),
    );
  }
}</code></pre><p>이 예제에서는 extendBodyBehindAppBar 속성을 true로 설정하여, ListView 위젯이 AppBar 아래로 확장되도록 했습니다. 또한 AppBar의 배경색을 투명하게 설정하고, 그림자 효과를 없앴습니다. 이를 통해 ListView 위젯이 AppBar 아래로 스크롤되면서, 더욱 독특한 디자인을 구현할 수 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[preferredsize는 뭔가]]></title>
            <link>https://velog.io/@master_choi/preferredsize%EB%8A%94-%EB%AD%94%EA%B0%80</link>
            <guid>https://velog.io/@master_choi/preferredsize%EB%8A%94-%EB%AD%94%EA%B0%80</guid>
            <pubDate>Mon, 10 Apr 2023 07:42:05 GMT</pubDate>
            <description><![CDATA[<p>Flutter에서 PreferredSize는 주로 앱의 상단 바(AppBar)나 하단 바(BottomNavigationBar)와 같은 위젯에 사용되며, 위젯의 선호되는 크기를 지정하는 역할을 합니다. 이 클래스는 주로 Scaffold의 appBar 속성에서 사용되며, 사용자가 PreferredSize 위젯을 사용하여 AppBar의 높이를 변경하거나 다른 사용자 지정 위젯의 선호되는 크기를 지정할 수 있습니다.</p>
<p>PreferredSize 위젯을 사용하는 방법은 다음과 같습니다:</p>
<pre><code>import &#39;package:flutter/material.dart&#39;;

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: PreferredSize(
          preferredSize: Size.fromHeight(80.0), // 여기서 AppBar의 높이를 지정합니다.
          child: AppBar(
            title: Text(&#39;Custom AppBar Height&#39;),
          ),
        ),
        body: Center(child: Text(&#39;Hello World!&#39;)),
      ),
    );
  }
}</code></pre><p>위 예제에서는 PreferredSize 위젯을 사용하여 AppBar의 높이를 80.0으로 설정했습니다. 이렇게 하면 AppBar의 크기가 선호되는 크기에 맞게 조정됩니다.</p>
]]></description>
        </item>
    </channel>
</rss>