我想将 StatelessWidget 与 BottomNavigationBar 一起使用,我可以通过BLOC对其进行控制。我可以将 Scaffold 的 body 和 BottomNavigationBar 的 onTap 连接到BLOC(请参见代码) 。但是我不明白如何从BLOC(来自Observable)设置 BottomNavigationBar 的 currentIndex 。
有什么好的解决方法吗?还是需要像https://stackoverflow.com/a/53019841/936780中那样使用 StatefulWidget ?
BLOC代码:
npm ci
小部件代码:
import numpy as np
import scipy.special
def volume (a,b,c,n): #where a,b,c are the axis of the ellipsoid and n
is the accuracy of the monte carlo integration
volume= (4/3)*np.pi*a*b*c
答案 0 :(得分:2)
我认为您需要将Scaffold
包裹在具有初始数据集的StreamBuilder
中,然后才能访问快照数据。像这样(我必须对您的代码进行一些更改,以便它可以为我构建)
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
final bloc = Bloc();
final List<Widget> _children = [
Container(color: Colors.blue, child: Center(child: Text("1"))),
Container(color: Colors.red, child: Center(child: Text("2"))),
Container(color: Colors.green, child: Center(child: Text("3"))),
Container(color: Colors.yellow, child: Center(child: Text("4"))),
Container(color: Colors.orange, child: Center(child: Text("5"))),
];
return StreamBuilder<int>(
stream: bloc.currentTabIndex,
initialData: 0,
builder: (BuildContext context, AsyncSnapshot<int> snapshot) {
if (!snapshot.hasData) {
return Container();
}
return Scaffold(
appBar: AppBar(
title: Text("Test"),
),
body: _children[snapshot.data],
bottomNavigationBar: BottomNavigationBar(
currentIndex: snapshot.data,
onTap: (index) {
bloc.setTabIndex(index);
},
items: _children
.map((child) => BottomNavigationBarItem(
icon: Icon(Icons.add),
title: Text("Test"),
backgroundColor: Colors.black))
.toList(),
),
);
},
);
}
}
这对我有用,这里唯一的缺点是每次索引更改时都将不必要地重建AppBar
。