class MyHome extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: Container(
child: ConstrainedBox(
constraints: BoxConstraints(
maxHeight: 100,
maxWidth: 100,
),
child: Icon(
Icons.backup,
size: 200,
),
),
));
}
}
в приведенном выше коде, если я заменю виджет значка изображением или текстом, они останутся в границах ConstrainedBox, но значок получит полный размер! почему?
Вы можете скопировать и вставить полный код ниже
Потому что в исходном коде Icon
на самом деле используются RichText
и TextOverflow.visible
.
ссылка на исходный код https://github.com/flutter/flutter/blob/8df56056b4914060784e68e6b149a30319b75d3d/packages/flutter/lib/src/widgets/icon.dart#L174
фрагмент исходного кода
Widget iconWidget = RichText(
overflow: TextOverflow.visible, // Never clip.
textDirection: textDirection, // Since we already fetched it for the assert...
text: TextSpan(
text: String.fromCharCode(icon!.codePoint),
style: TextStyle(
inherit: false,
color: iconColor,
fontSize: iconSize,
fontFamily: icon!.fontFamily,
package: icon!.fontPackage,
),
),
);
рабочая демонстрация использования RichText
полное использование кода RichText
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHome(),
);
}
}
class MyHome extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: Container(
child: ConstrainedBox(
constraints: BoxConstraints(
maxHeight: 100,
maxWidth: 100,
),
child: RichText(
overflow: TextOverflow.visible, // Never clip.
//textDirection: textDirection, // Since we already fetched it for the assert...
text: TextSpan(
text: String.fromCharCode((Icons.backup).codePoint),
style: TextStyle(
inherit: false,
color: Colors.blue,
fontSize: 200,
fontFamily: (Icons.backup).fontFamily,
package: (Icons.backup).fontPackage,
),
),
)),
));
}
}