Vintage appMaker의 Tech Blog

[Flutter] 줄맞춤이 필요할 때, TextBaseline, Baseline widget 본문

Source code or Tip/Flutter & Dart

[Flutter] 줄맞춤이 필요할 때, TextBaseline, Baseline widget

VintageappMaker 2022. 12. 27. 21:51

 

Row에서 화면의 다른크기의 문자들을 아래줄부터 맞추어야 할 때는

Row의 textBaseline 파라메터를 TextBaseline.alphabetic로 넘긴다. 

그리고 crossAxisAlignment 파라메터를 CrossAxisAlignment.baseline으로 넘긴다.


부모위젯의 범위에 벗어나는 위치에 위젯을 배치하고자 한다면 Baseline 위젯을 사용할 때도 있다. 

단, 부모위젯의 크기가 Fix가 된 상태여야 하며, baseline을 기준으로 위치를 지정해야 한다. 

baseline 파라메터는 부모위젯의 baseline을 기준으로 얼마만큼 이동할 지를 설정한다. -값을 가질 경우, 위로 향한다. 

baselineType 파라메터는 일반적으로 TextBaseline.alphabetic을 설정한다. 

 

          

다음은 전체소스이다. 

import 'package:flutter/material.dart';

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

class TestApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'test',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: UnderLineTestBar(),
    );
  }
}

class UnderLineTestBar extends StatefulWidget {
  UnderLineTestBar({Key? key}) : super(key: key);

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

class _UnderLineTestBarState extends State<UnderLineTestBar> {
  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    List<Widget> lstWidget = [
      Text(
        "Hi",
        style: TextStyle(fontSize: 40),
      ),
      Text(
        "Hi",
        style: TextStyle(fontSize: 20),
      ),
      Text(
        "Hi",
        style: TextStyle(fontSize: 10),
      ),
    ];
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.transparent,
        elevation: 0.0,
      ),
      body: Center(
        child: Column(
          children: [
            Row(
              crossAxisAlignment: CrossAxisAlignment.baseline,
              textBaseline: TextBaseline.alphabetic,
              children: lstWidget,
            ),
            Divider(
              height: 1,
            ),
            Row(
              //crossAxisAlignment: CrossAxisAlignment.baseline,
              textBaseline: TextBaseline.alphabetic,
              children: lstWidget,
            ),
            Divider(
              height: 1,
            ),
            Container(
              width: double.infinity,
              margin: EdgeInsets.all(20),
              height: 150,
              child: Card(
                color: Colors.green,
                child: Baseline(
                  baseline: 160,
                  baselineType: TextBaseline.alphabetic,
                  child: Align(
                      alignment: Alignment.centerRight,
                      child: Icon(
                        Icons.add_a_photo,
                        size: 40,
                      )),
                ),
              ),
            )
          ],
        ),
      ),
    );
  }
}
Comments