如何解决从另一个类调用TabController.animate
所以我有4个标签的标签栏类,
,这是标签2类别标签
,我想要的是显示在主主页标签中的横幅
,当我单击横幅时,它转到类别选项卡
不在类别页面上,但是如果您知道有人知道的话不知道该怎么做,请告诉我我知道tabcontroller animate方法,但是不知道如何从不同的类调用它
const int tabCount = 3;
const int turnsToRotateRight = 1;
const int turnsToRotateLeft = 3;
class MainTabControlDelegate {
int index;
Function(String naMetab) changeTab;
Function(int index) tabAnimateto;
static MainTabControlDelegate _instance;
static MainTabControlDelegate getInstance() {
return _instance ??= MainTabControlDelegate._();
}
MainTabControlDelegate._();
}
class MainTabs extends StatefulWidget {
MainTabs({Key key}) : super(key: key);
@override
MainTabsstate createState() => MainTabsstate();
}
class MainTabsstate extends State<MainTabs>
with
WidgetsBindingObserver,SingleTickerProviderStateMixin,AfterLayoutMixin {
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
final PageStorageBucket bucket = PageStorageBucket();
final StreamController<String> _controllerRouteWeb =
StreamController<String>.broadcast();
final _auth = FirebaseAuth.instance;
var tabData;
Map saveIndexTab = Map();
FirebaseUser loggedInUser;
bool isAdmin = false;
final List<Widget> _tabView = [];
TabController tabController;
@override
void afterFirstLayout(BuildContext context) {
loadTabBar(context);
}
Widget tabView(Map<String,dynamic> data) {
switch (data['layout']) {
case 'category':
return CategoriesScreen(
key: Key("category"),layout: data['categoryLayout'],categories: data['categories'],images: data['images'],showChat: data['showChat'],);case 'search':
return SearchScreen(key: Key("search"),showChat: data['showChat']);
case 'cart':
return CartScreen(showChat: data['showChat']);
case 'profile':
return UserScreen(
settings: data['settings'],background: data['background'],showChat: data['showChat']);
case 'blog':
return HorizontalSliderList(config: data);
case 'wishlist':
return screen.WishList(canPop: false,showChat: data['showChat']);
case 'page':
return WebViewScreen(
title: data['title'],url: data['url'],showChat: data['showChat']);
case 'html':
return StaticSite(data: data['data'],showChat: data['showChat']);
case 'static':
return StaticPage(data: data['data'],showChat: data['showChat']);
case 'postScreen':
return PostScreen(
pageId: data['pageId'],pageTitle: data['pageTitle'],isLocatedInTabbar: true,showChat: data['showChat']);
case 'dynamic':
default:
return HomeScreen();
}
}
void changeTab(String naMetab) {
if (kLayoutWeb) {
_controllerRouteWeb.sink
.add(naMetab.contains("/") ? naMetab : '/$naMetab');
} else {
tabController?.animateto(saveIndexTab[naMetab] ?? 0);
}
}
void loadTabBar(context) {
tabData = Provider.of<AppModel>(context,listen: false).appConfig['TabBar']
as List;
for (var i = 0; i < tabData.length; i++) {
Map<String,dynamic> _dataOfTab = Map.from(tabData[i]);
saveIndexTab[_dataOfTab['layout']] = i;
_tabView.add(tabView(_dataOfTab));
}
setState(() {
tabController = TabController(length: _tabView.length,vsync: this);
});
if (MainTabControlDelegate.getInstance().index != null) {
tabController.animateto(MainTabControlDelegate.getInstance().index);
} else {
MainTabControlDelegate.getInstance().index = 0;
}
// Load the Design from FluxBuilder
tabController.addListener(() {
eventBus.fire('tab_${tabController.index}');
if (_tabView[tabController.index] is SearchScreen) {
eventBus.fire(UpdateSearchFilterEvent());
}
MainTabControlDelegate.getInstance().index = tabController.index;
});
}
这是横幅项目dart,我要在其中打开选项卡2,这里有一个onTap方法,如何在此处调用tabcontroller动画选项
class BannerImageItem extends StatefulWidget {
@override
final Key key;
final dynamic config;
final double width;
final double padding;
final BoxFit BoxFit;
final double radius;
BannerImageItem({
this.key,this.config,this.padding,this.width,this.BoxFit,this.radius,}) : super(key: key);
@override
_BannerImageItemState createState() => _BannerImageItemState();
}
class _BannerImageItemState extends State<BannerImageItem>
with AfterLayoutMixin {
List<Product> _products;
@override
void afterFirstLayout(BuildContext context) {
/// for pre-load the list product
if (widget.config['data'] != null) {
print(widget.config['data']);
_products = widget.config['data'];
}
}
@override
Widget build(BuildContext context) {
double _padding =
Tools.formatDouble(widget.config["padding"] ?? widget.padding ?? 10.0);
double _radius = Tools.formatDouble(widget.config['radius'] ??
(widget.radius != null ? widget.radius : 0.0));
final screenSize = MediaQuery.of(context).size;
final screenWidth =
screenSize.width / (2 / (screenSize.height / screenSize.width));
final itemWidth = widget.width ?? screenWidth;
return GestureDetector(
onTap: () { Navigator.of(context).pushNamed("/category");},child: Container(
width: itemWidth,child: Padding(
padding: EdgeInsets.only(left: _padding,right: _padding),child: ClipRRect(
borderRadius: BorderRadius.circular(_radius),child: Tools.image(
fit: widget.BoxFit ?? BoxFit.fitWidth,url: widget.config["image"],),);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。