Dart 颤振:有人能帮我们在颤振中制作定制的TabController吗?
我正在使用颤振(飞镖)制作一个应用程序。我需要做一个带有渐变背景色的标签控制器。我使用了DefaultTabController,但无法为应用程序栏添加装饰或任何渐变。请在下面查找我的代码:Dart 颤振:有人能帮我们在颤振中制作定制的TabController吗?,dart,flutter,flutter-layout,flutter-dependencies,Dart,Flutter,Flutter Layout,Flutter Dependencies,我正在使用颤振(飞镖)制作一个应用程序。我需要做一个带有渐变背景色的标签控制器。我使用了DefaultTabController,但无法为应用程序栏添加装饰或任何渐变。请在下面查找我的代码: import 'package:flutter/material.dart'; import 'package:vtech/CustomAppBar.dart'; class Policy extends StatefulWidget { @override _PolicyState create
import 'package:flutter/material.dart';
import 'package:vtech/CustomAppBar.dart';
class Policy extends StatefulWidget {
@override
_PolicyState createState() => _PolicyState();
}
class _PolicyState extends State<Policy> {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: DefaultTabController(
length: 3,
child: Scaffold(
appBar: AppBar(
backgroundColor: Colors.pink,
bottom: TabBar(
tabs: [
Tab(icon: Icon(Icons.directions_car)),
Tab(icon: Icon(Icons.directions_transit)),
Tab(icon: Icon(Icons.directions_bike)),
],
),
title: Center(child:Text('POLICY')),
),
body: TabBarView(
children: [
Icon(Icons.directions_car),
Icon(Icons.directions_transit),
Icon(Icons.directions_bike),
],
),
),
),
);
}
}
导入“包装:颤振/材料.省道”;
导入“包装:vtech/CustomAppBar.dart”;
类策略扩展了StatefulWidget{
@凌驾
_PolicyState createState()=>\u PolicyState();
}
类_PolicyState扩展状态{
@凌驾
小部件构建(构建上下文){
返回材料PP(
主页:DefaultTabController(
长度:3,
孩子:脚手架(
appBar:appBar(
背景颜色:Colors.pink,
底部:选项卡栏(
选项卡:[
选项卡(图标:图标(图标方向车)),
选项卡(图标:图标(图标方向和交通)),
选项卡(图标:图标(图标方向)),
],
),
标题:中心(子项:文本(“策略”),
),
正文:选项卡视图(
儿童:[
图标(图标、方向和汽车),
图标(图标、方向和交通),
图标(图标、方向和自行车),
],
),
),
),
);
}
}
AppBar
和TabBar小部件不允许设置渐变,只允许设置颜色
要实现所需功能,您可以创建一个自定义小部件GradientAppBar
或GradientTabBar
,该小部件由堆栈构建,该堆栈集成了一个带有渐变和AppBar
或TabBar
的容器
创建带有参数的GradientAppBar
,这些参数将进入容器和AppBar
本身
下面是Gradient AppBar的一个工作示例。下面是TabBar的一个类似示例
import 'package:flutter/material.dart';
void main() => runApp(new MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Flutter Demo',
theme: new ThemeData(
primarySwatch: Colors.blue,
),
home: new Policy(),
);
}
}
class Policy extends StatefulWidget {
@override
_PolicyState createState() => _PolicyState();
}
class _PolicyState extends State<Policy> {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: DefaultTabController(
length: 3,
child: Scaffold(
appBar: GradientAppBar(
colors: [Colors.white, Colors.black],
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
elevation: 4.0,
bottom: TabBar(
indicatorColor: Colors.white,
tabs: [
Tab(icon: Icon(Icons.directions_car)),
Tab(icon: Icon(Icons.directions_transit)),
Tab(icon: Icon(Icons.directions_bike)),
],
),
title: Center(child: Text('POLICY')),
),
body: TabBarView(
children: [
Icon(Icons.directions_car),
Icon(Icons.directions_transit),
Icon(Icons.directions_bike),
],
),
),
),
);
}
}
class GradientAppBar extends StatefulWidget implements PreferredSizeWidget {
// Gradiente properties
final AlignmentGeometry begin;
final AlignmentGeometry end;
final List<Color> colors;
// Material property
final double elevation;
// AppBar properties - Add all you need to change
final Widget title;
final PreferredSizeWidget bottom;
@override
final Size preferredSize;
GradientAppBar({
Key key,
@required this.colors,
this.begin = Alignment.centerLeft,
this.end = Alignment.centerRight,
this.elevation,
this.title,
this.bottom,
}) : preferredSize = new Size.fromHeight(
kToolbarHeight + (bottom?.preferredSize?.height ?? 0.0)),
super(key: key); //appBar.preferredSize;
@override
_GradientAppBarState createState() => _GradientAppBarState();
}
class _GradientAppBarState extends State<GradientAppBar> {
@override
Widget build(BuildContext context) {
return Stack(
children: <Widget>[
Material(
elevation: widget.elevation,
child: Container(
decoration: BoxDecoration(
gradient: LinearGradient(
begin: widget.begin,
end: widget.end,
colors: widget.colors,
)),
),
),
AppBar(
backgroundColor: Colors.transparent,
elevation: 0.0,
bottom: widget.bottom,
title: widget.title,
),
],
);
}
}
导入“包装:颤振/材料.省道”;
void main()=>runApp(新的MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回新材料PP(
标题:“颤振演示”,
主题:新主题数据(
主样本:颜色。蓝色,
),
主页:新政策(),
);
}
}
类策略扩展了StatefulWidget{
@凌驾
_PolicyState createState()=>\u PolicyState();
}
类_PolicyState扩展状态{
@凌驾
小部件构建(构建上下文){
返回材料PP(
主页:DefaultTabController(
长度:3,
孩子:脚手架(
appBar:GradientAppBar(
颜色:[颜色。白色,颜色。黑色],
开始:Alignment.topCenter,
结束:对齐。底部中心,
标高:4.0,
底部:选项卡栏(
指示颜色:颜色。白色,
选项卡:[
选项卡(图标:图标(图标方向车)),
选项卡(图标:图标(图标方向和交通)),
选项卡(图标:图标(图标方向)),
],
),
标题:中心(子项:文本(“策略”),
),
正文:选项卡视图(
儿童:[
图标(图标、方向和汽车),
图标(图标、方向和交通),
图标(图标、方向和自行车),
],
),
),
),
);
}
}
类GradientAppBar扩展StatefulWidget实现PreferredSizeWidget{
//梯度特性
最终路线几何开始;
最终对齐几何图形结束;
最后列出颜色;
//材料性质
最终双立面图;
//AppBar属性-添加所有需要更改的内容
最终小部件标题;
最终优选尺寸边缘底部;
@凌驾
最终尺寸首选尺寸;
梯度ppbar({
关键点,
@需要这个颜色,
this.begin=Alignment.centerLeft,
this.end=Alignment.centerRight,
这是海拔高度,
这个名字,
这个,底部,
}):preferredSize=新尺寸。fromHeight(
kToolbarHeight+(底部?首选尺寸?高度?0.0)),
super(key:key);//appBar.preferredSize;
@凌驾
_GradientAppBarState createState()=>GradientAppBarState();
}
类_GradientAppBarState扩展状态{
@凌驾
小部件构建(构建上下文){
返回堆栈(
儿童:[
材料(
标高:widget.elevation,
子:容器(
装饰:盒子装饰(
梯度:线性梯度(
开始:widget.begin,
end:widget.end,
颜色:widget.colors,
)),
),
),
AppBar(
背景颜色:颜色。透明,
标高:0.0,
bottom:widget.bottom,
标题:widget.title,
),
],
);
}
}
这里是渐变选项卡的例子
import 'package:flutter/material.dart';
void main() => runApp(new MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Flutter Demo',
theme: new ThemeData(
primarySwatch: Colors.blue,
),
home: new Policy(),
);
}
}
class Policy extends StatefulWidget {
@override
_PolicyState createState() => _PolicyState();
}
class _PolicyState extends State<Policy> {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: DefaultTabController(
length: 3,
child: Scaffold(
appBar: AppBar(
bottom: GradientTabBar(
colors: [Theme.of(context).primaryColor, Colors.green],
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
tabBar: TabBar(
//indicatorColor: Colors.white,
tabs: [
Tab(icon: Icon(Icons.directions_car)),
Tab(icon: Icon(Icons.directions_transit)),
Tab(icon: Icon(Icons.directions_bike)),
],
),
),
title: Center(child: Text('POLICY')),
),
body: TabBarView(
children: [
Icon(Icons.directions_car),
Icon(Icons.directions_transit),
Icon(Icons.directions_bike),
],
),
),
),
);
}
}
class GradientTabBar extends StatefulWidget implements PreferredSizeWidget {
// Gradiente properties
final AlignmentGeometry begin;
final AlignmentGeometry end;
final List<Color> colors;
final TabBar tabBar;
GradientTabBar({
Key key,
@required this.colors,
this.begin = Alignment.centerLeft,
this.end = Alignment.centerRight,
this.tabBar,
}) : super(key: key);
@override
Size get preferredSize => tabBar.preferredSize;
@override
_GradientTabBarState createState() => _GradientTabBarState();
}
class _GradientTabBarState extends State<GradientTabBar> {
@override
Widget build(BuildContext context) {
return Stack(
children: <Widget>[
Container(
height: widget.preferredSize.height,
decoration: BoxDecoration(
gradient: LinearGradient(
begin: widget.begin,
end: widget.end,
colors: widget.colors,
)),
),
widget.tabBar,
],
);
}
}
导入“包装:颤振/材料.省道”;
void main()=>runApp(新的MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回新材料PP(
标题:“颤振演示”,
主题:新主题数据(
主样本:颜色。蓝色,
),
主页:新政策(),
);
}
}
类策略扩展了StatefulWidget{
@凌驾
_PolicyState createState()=>\u PolicyState();
}
类_PolicyState扩展状态{
@凌驾
小部件构建(构建上下文){
返回材料PP(
主页:DefaultTabController(
长度:3,
孩子:脚手架(
appBar:appBar(
底部:GradientTabBar(
颜色:[主题.背景.原色,颜色.绿色],
开始:Alignment.topCenter,
结束:对齐。底部中心,
tabBar:tabBar(
//指示颜色:颜色。白色,
选项卡:[
选项卡(图标:图标(图标方向车)),
选项卡(图标:图标(图标方向和交通)),
选项卡(图标:图标(图标方向)),
flexibleSpace: Container(
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.centerLeft,
end: Alignment.centerRight,
colors: [
Colors.red,
Colors.blue
],
),
),
),
appBar: AppBar(
title: Center(child: Text("Add Student",),),
flexibleSpace: Container(
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.centerLeft,
end: Alignment.centerRight,
colors: [
darkblue,
darkpurple
],
),
),
),
actions: <Widget>[
IconButton(
icon: Icon(Icons.account_circle,color: Colors.white,),),
],
),