TabBar 的索引在隐藏时会发生变化



我正在构建一个脚手架,其中TabBar作为BottomNavigationBar,TabView作为正文。问题是,当我打开键盘以在表单中输入数据时,由于某种原因,TabBar 会更改索引(即使在 TabView 内部也不会)。为什么会这样?我怎样才能证明它?

class _SignState extends State<Sign> with TickerProviderStateMixin {
static Container navBar;
static TabBarView pages;
@override
Widget build(BuildContext context) {
final tabController = TabController(length: 2, vsync: this);
print(tabController.index);
void _goLogin() {
//  tabController.animateTo(tabController.previousIndex);
}
pages = TabBarView(controller: tabController, children: [
LoginPage(
keyRoot: widget.keyRoot,
),
RegisterPage(
onRegistered: _goLogin,
),
]);
navBar = Container(
height: 50,
alignment: Alignment.center,
padding: EdgeInsets.only(left: 50, right: 50),
child: Stack(
alignment: Alignment.center,
children: <Widget>[
Padding(
padding: const EdgeInsets.all(10.0),
child: Container(
decoration: BoxDecoration(
color: Colors.transparent,
borderRadius: BorderRadius.circular(30),
border: Border.all(
width: 0.3,
color: Colors.black.withOpacity(0.5),
style: BorderStyle.solid))),
),
TabBar(
controller: tabController,
labelPadding: EdgeInsets.all(10),
labelColor: Colors.white,
unselectedLabelColor: Theme.of(context).primaryColor,
indicator: BoxDecoration(
boxShadow: [
BoxShadow(
color: Colors.black,
blurRadius: 1,
)
],
borderRadius: BorderRadius.circular(30),
color: Theme.of(context).primaryColor,
),
tabs: [Text('Accedi'), Text('Registrati')]),
],
),
);
// Main page
return Scaffold(
body: Column(
children: <Widget>[
_returnTop(),
Expanded(
child: pages,
),
],
),
persistentFooterButtons: _returnButtons(),
bottomNavigationBar: Padding(
padding: const EdgeInsets.only(bottom: 15),
child: navBar,
),
);
}
Widget _returnTop() {
return Stack(children: <Widget>[
Center(child: Image.asset('assets/logo_sign.png')),
Positioned(
bottom: 0,
right: 20,
child: InkWell(
splashColor: Colors.transparent,
child: Text('salta >'),
onTap: () {
Navigator.pushNamed(context, "/home", arguments: widget.keyRoot);
},
),
)
]);
}
List<Widget> _returnButtons() {
return [
Text('oppure con'),
IconButton(
//TODO: Aggiungere funzioni
color: Theme.of(context).accentColor,
icon: Icon(FontAwesomeIcons.googlePlusG),
tooltip: 'Login con Google',
onPressed: () {}),
IconButton(
//TODO: Aggiungere funzioni
color: Theme.of(context).accentColor,
icon: Icon(FontAwesomeIcons.facebook),
tooltip: 'Login con Facebook',
onPressed: () {}),
IconButton(
//TODO: Aggiungere funzioni
color: Theme.of(context).accentColor,
icon: Icon(FontAwesomeIcons.twitter),
tooltip: 'Login con Twitter',
onPressed: () {}),
];
}
}

修改:这是我的整个代码:)

问题是您已在构建方法中添加了 TabController 初始值设定项。然后,当键盘出现时,运行生成方法并再次初始化选项卡控制器。正确的方法是在 initState 方法中初始化 TabController。

@override
void initState() {
super.initState();
_tabController = TabController(vsync: this, length: choices.length);
}

最新更新