Я использую TabBarView с элементами класса:
TabBarView(
controller: _tabController,
children: const [
ListaCatTareas(),
ListaSubCatTareas(),
ListaTiposTareas(),
],
),
Я хотел бы изменить активный индекс панели вкладок внутри всех дочерних виджетов.
Например, я выбрал открытие виджета по индексу 1, то есть ListaSubCatTareas, то внутри этого виджета мне может понадобиться изменить активный индекс панели вкладок на 0 или 2.
@WilsonToribio, спасибо, я уже использую функцию обратного вызова, которая получает параметр, но мне нужно знать, как изменить активную вкладку индекса внутри дочерней вкладки.
Я очень рад помочь вам. Но я не вижу, чтобы ListaSubCatTareas() или любые другие дочерние виджеты использовали обратный вызов, или вы не указали его здесь? Альтернативой, которую вы можете использовать, является использование Provider для изменения индекса из класса провайдера.
@WilsonToribio, что тебе нужно посмотреть?
@WilsonToribio, я попытаюсь использовать Provider, может быть, это решение, по крайней мере, на данный момент.
На самом деле, когда обратный вызов передается виджету, он передается следующим образом: ListaSubCatTareas(callback: changeindex)
им вы передаете то, что хотите сделать внутри виджета, например: callback(2)
, но я не вижу, чтобы вы передавали его виджетам.
Вы можете использовать tabController.index
, чтобы изменить активный индекс панели вкладок. проверьте выполнение ниже кода.
import 'package:flutter/material.dart';
const Color darkBlue = Color.fromARGB(255, 18, 32, 47);
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData.dark().copyWith(
scaffoldBackgroundColor: darkBlue,
),
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Center(
child: TabBarSampleClass(),
),
),
);
}
}
class TabBarSampleClass extends StatefulWidget {
@override
_TabBarSampleClassState createState() => _TabBarSampleClassState();
}
class _TabBarSampleClassState extends State<TabBarSampleClass>
with SingleTickerProviderStateMixin {
late final _tabController = TabController(length: 3, vsync: this);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Tab Navigation'),
bottom: TabBar(
controller: _tabController,
tabs: const <Widget>[
Tab(
icon: Icon(Icons.book, color: Colors.white),
text: 'TabOne',
),
Tab(
icon: Icon(Icons.chat, color: Colors.white),
text: 'TabTwo',
),
Tab(
icon: Icon(Icons.access_alarm, color: Colors.white),
text: 'TabThree',
),
],
),
),
body: TabBarView(
controller: _tabController,
children: [
IconButton(
icon: const Icon(
Icons.arrow_circle_right,
),
iconSize: 50,
color: Colors.green,
splashColor: Colors.purple,
onPressed: () {
//Navigate to tab 2
_tabController.index = 1;
},
),
IconButton(
icon: const Icon(
Icons.arrow_circle_right,
),
iconSize: 50,
color: Colors.green,
splashColor: Colors.purple,
onPressed: () {
//Navigate to tab 3
_tabController.index = 2;
},
),
IconButton(
icon: const Icon(
Icons.arrow_circle_right,
),
iconSize: 50,
color: Colors.green,
splashColor: Colors.purple,
onPressed: () {
//Navigate to tab 1
_tabController.index = 0;
},
),
],
),
);
}
}
или, если вы используете CustomWidgetClass, передайте объект _tabController пользовательскому виджету и перемещайтесь по тому же _tabController.index = 2;
CustomClassForThridTab(
tabcontroller: _tabController
),
Используйте обратный вызов внутри виджета, который запускает функцию снаружи, вы также можете передавать параметры в функцию. Дополнительные сведения см. в этом руководстве: digitalocean.com/community/tutorials/….