質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Q&A

1回答

1555閲覧

flutter richtext で上付き文字を表示する方法

VortoTekoF

総合スコア0

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

0グッド

0クリップ

投稿2021/05/16 02:16

flutter で辞書プログラムを作成しています。元のテキストにhtmlのタグ,
下付文字<sub>、上付き文字<sup>を付けています。このタグを利用して、richtextで表示したいのですが、上付き文字を作成出来ません。下付文字は、フォントサイズを小さくするだけで、一応の体裁はつくれましたが、上付き文字を上に表示する方法が分かりません。TextStyle で調べても、出てきません。htmlではbaselineをmiddleなどに指定できるようですが、flutter ではどのように書けるのでしょうか?

テスト用のコードです。floatingActionButtonを押すと、辞書数件を表示します。
上付き・下付き文字を、fontSize を小さく、色も変えています。

TextStyle(color: Colors.purple, TextBaseline: TextBaseline.middle, fontSize: 20.0),//上付き文字用

と書くとエラーになります。

イメージ説明

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

void main() => runApp(MyApp());

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

class MyCustomForm extends StatefulWidget {
@override
_MyCustomFormState createState() => _MyCustomFormState();
}

class _MyCustomFormState extends State<MyCustomForm> {

final _fst = [ TextStyle(color: Colors.black, fontSize: 26.0), TextStyle(color: Colors.purple, fontSize: 20.0),//上付き文字用 TextStyle(color: Colors.purple, fontSize: 20.0),//下付き文字用 ]; var _st = []; var _st_add_pre = 0; var _st_add_post = 0; var _vline = []; final _sub_start = "<sub>"; final _sub_end = "</sub>"; final _sup_start = "<sup>"; final _sup_end = "</sup>"; var _tag_On = "0"; final _resultoj = []; final vortaro = [ ["aerogram|o<sup>1</sup>", "航空書簡."], ["aerogram|o<sup>2</sup>", "エアログラム."], ["-ilion-", "例 duiliono 一兆, =10<sup>12</sup>."], ["acetil|o", "アセチル基 〔CH<sub>3</sub>CO‐〕."], ["rodano", "チオシアン 〔(SCN)<sub>2</sub>のこと〕."] ]; List _tag_split(String tag, teksto) { var duopo = [teksto, ""]; _st_add_post = 0; if (teksto.contains(tag)) { duopo = teksto.replaceFirst(tag, "@").split("@"); if (tag == _sup_start) _st_add_post = 1; if (tag == _sub_start) _st_add_post = 2; } return duopo; } String _tag_check(String teksto) { var check = ""; if (teksto.contains(">")) { var duopo = teksto.split(">");///最初の『<』を使って if (duopo[0].length > 3) { if (duopo[0].contains("<sub")) check = _sub_start; /// <sub> if (duopo[0].contains("<sup")) check = _sup_start; /// <sup> } if (duopo[0].length > 4) { if (duopo[0].contains("</sub")) check = _sub_end; /// </sub> if (duopo[0].contains("</sup")) check = _sup_end; /// </sup> } } return check; } String _tag_On_set(String tag) { var tag_On = "0"; if (tag == _sub_start || tag == _sup_start) tag_On = "1"; if (tag == _sub_end || tag == _sup_end) tag_On = "0"; return tag_On; } void _tag_shori(String teksto) { var Du = []; var v = 1; while (v < 500 && teksto != "") {// while ++v; var tag = _tag_check(teksto); if (tag == "") { _vline.add(teksto); _st.add(_fst[_st_add_pre]); teksto = ""; } else if (tag != "") { Du = _tag_split(tag, teksto); if (Du[0] != "") { _vline.add(Du[0]); _st.add(_fst[_st_add_pre]); } _st_add_pre = _st_add_post; _tag_On = _tag_On_set(tag); teksto = Du[1]; } }/// while owari } Widget _buildRow(result) { _tag_On = "0"; _st = []; _vline = []; var teksto = result; if (_tag_check(teksto) != "") { /// tag を含む時のみ実行する _tag_shori(teksto); } else { /// tag を含まない時実行する _vline.add(teksto); if (_tag_On == "0") /// _tag_On は _tag_check で設定される _st.add(_fst[0]); if (_tag_On == "1") { _st.add(_fst[_st_add_pre]); } } return RichText( text: TextSpan( children: <TextSpan>[ for (int m = 0; m < _vline.length; ++m) if (_vline[m] != "") TextSpan(text: _vline[m], style: _st[m]), ] ) ); } Widget _buttomOnTest() { setState(() { var _vortaroMax = vortaro.length; _resultoj.clear(); var i = 0; while (i < _vortaroMax) { _resultoj.add("☆" + vortaro[i][0] + "☆"); _resultoj.add(vortaro[i][1]); _resultoj.add(""); ++i; } }); } Widget _buildResults() { return ListView.builder( itemCount: max(0, _resultoj.length), padding: const EdgeInsets.all(16.0), itemBuilder: /*1*/ (context, i) { return _buildRow(_resultoj[i]); } ); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Row(mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ Text("RichText test"), SizedBox(width: 12), ]), ), body: Center(child: _buildResults()), floatingActionButton: FloatingActionButton( onPressed: _buttomOnTest, tooltip: 'Increment', child: Icon(Icons.add), ), ); }

}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

TeXを使うと数式を表現できるので、TeXで下付き文字、上付き文字を表現することができます。

Flutter上でTeXを表示するライブラリがいくつかあります。
例: flutter_math_fork

もしくは、やりたいことが、下付き文字、上付き文字の数字だけとかであれば、そういう文字が存在するのでそれを使うてもあると思います

投稿2021/05/27 22:36

popobot

総合スコア6586

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問