英文:
Ink/IconButton color inside Container
问题
我有一个位于Container内部的Ink中的IconButton(为其提供边框),但由于容器的颜色叠加在其上,边框不可见。
在Container内部显示具有有色背景的IconButton的最佳方法是什么?
工作示例:
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Center(
child: MyWidget(),
),
),
);
}
}
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
color: Colors.pink,
child: Center(
child: Ink(
decoration: const ShapeDecoration(
color: Colors.black,
shape: CircleBorder(),
),
child: IconButton(
icon: Icon(Icons.android),
color: Colors.white,
onPressed: () {},
),
),
),
);
}
}
英文:
I have an IconButton inside an Ink (to give it a Border) which is inside a Container. However the Border is not visible since it is overlaid by the Containers color.
What is the best way to display an IconButton with a colored background inside a Container?
Working example:
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Center(
child: MyWidget(),
),
),
);
}
}
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
color: Colors.pink,
child: Center(
child: Ink(
decoration: const ShapeDecoration(
color: Colors.black,
shape: CircleBorder(),
),
child: IconButton(
icon: Icon(Icons.android),
color: Colors.white,
onPressed: () {},
),
),
),
);
}
}
答案1
得分: 9
使用Material
而不是Container
(查看官方示例)。
之所以Container
不起作用是因为Ink是绘制在底层的Material
小部件上,如Ink文档中所解释的:
> Ink涟漪和高亮,由InkWell和InkResponse渲染,
> 在实际的底层Material上绘制,在其上绘制任何小部件
> 覆盖材料(如文本和图标)。如果在Material上绘制不透明的图像
> (也许使用Container或DecoratedBox),
> 这些墨水效果将不可见,因为它们将完全被不透明的图形遮挡。
查看工作示例:
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Center(
child: MyWidget(),
),
),
);
}
}
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Material(
color: Colors.red,
child: Center(
child: Ink(
decoration: const ShapeDecoration(
color: Colors.black,
shape: CircleBorder(),
),
child: IconButton(
icon: Icon(Icons.android),
color: Colors.white,
onPressed: () {},
),
),
),
);
}
}
额外内容:
如果您真的需要一个不是Material的Container或其他小部件,只需在Ink小部件和父级小部件之间添加一个Material小部件(具有透明背景)。
像这样:
Container(
color: Colors.red,
child: Material(
color: Colors.transparent,
child: Center(
child: Ink(
decoration: const ShapeDecoration(
color: Colors.black,
shape: CircleBorder(),
),
child: IconButton(
icon: Icon(Icons.android),
color: Colors.white,
onPressed: () {},
),
),
),
))
英文:
Use Material
instead of Container
(see official example)
The reason Container
doesn't work is because the Ink is drawn on the underlying Material
widget, as explained in the Ink doc:
> Ink splashes and highlights, as rendered by InkWell and InkResponse,
> draw on the actual underlying Material, under whatever widgets are
> drawn over the material (such as Text and Icons). If an opaque image
> is drawn over the Material (maybe using a Container or DecoratedBox),
> these ink effects will not be visible, as they will be entirely
> obscured by the opaque graphics drawn above the Material.
See working demo:
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Center(
child: MyWidget(),
),
),
);
}
}
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Material(
color: Colors.red,
child: Center(
child: Ink(
decoration: const ShapeDecoration(
color: Colors.black,
shape: CircleBorder(),
),
child: IconButton(
icon: Icon(Icons.android),
color: Colors.white,
onPressed: () {},
),
),
),
);
}
}
EXTRA:
If you really need a Container or other widget that is not Material you just need to add a Material widget between the Ink Widget and the parent one. (with transparent background)
Like this:
Container(
color: Colors.red,
child: Material(
color: Colors.transparent,
child: Center(
child: Ink(
decoration: const ShapeDecoration(
color: Colors.black,
shape: CircleBorder(),
),
child: IconButton(
icon: Icon(Icons.android),
color: Colors.white,
onPressed: () {},
),
),
),
))
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论