我有這門課:
class BottomNavBar extends StatefulWidget {
final int activeTabIndex;
const BottomNavBar({Key? key, required this.activeTabIndex})
: super(key: key);
@override
BottomNavBarState createState() => BottomNavBarState();
}
class BottomNavBarState extends State<BottomNavBar> {
static bool isCollapsed = false;
@override
Widget build(BuildContext context) {
Scaffold(
body: SlidingUpPanel(
controller: _pc,
panelBuilder: (sc) {
setState(() {
isCollapsed ? _pc.show(): _pc.hide();
});
return Container(
child: Center(child: Text("Panel")),
);
},
body: Text("something");
), }
}
我想改變isCollapsed這個類中變數的值:
class _PlayerPreviewState extends State<PlayerPreview> {
@override
Widget build(BuildContext context) {
final String play = 'assets/icons/play.svg';
var pageWidth = MediaQuery.of(context).size.width;
return Padding(
padding: EdgeInsets.only(top: pageWidth * .04),
child: IconButton(
onPressed: () {
BottomNavBarState.isCollapsed = true;
},
icon: SvgPicture.asset(play),
),
);}}
我想在單擊 IconButton 時,isCollapsed 更改為 true。
當我列印時 BottomNavBarState.isCollapsed,列印 true 和它的變化。但在BottomNavBarState 中沒有改變。而這部分 ->if (isCollapsed == true) _pc.show();不起作用。
我知道我應該和報表管理器一起做,但我不知道他們。所以有人可以幫我嗎?如何更改 isCollaps 并運行_pc.show()
uj5u.com熱心網友回復:
您不應該這樣做:BottomNavBarState.isCollapsed = true;
因為您正在從狀態物件外部更改狀態,因此您沒有參考同一個實體。你也不應該把這個變數作為靜態變數。
解決方案:
是在兩個bottomBar的父類中創建一個函式來切換isCollapsed變數,例如:
父小部件
class ParentClass extends StatefulWidget {
final int activeTabIndex;
const ParentClass({Key? key, required this.activeTabIndex})
: super(key: key);
@override
ParentClassState createState() => ParentClassState();
}
class ParentClassState extends State<ParentClass> {
bool isCollapsed = false;
void setCollapsed(bool collapsed) {
setState(() {
isCollapsed = collapsed;
});
}
@override
Widget build(BuildContext context) {
return Column(
children: [
Player(
setCollapsed: setCollapsed,
),
BottomBar(
isCollapsed: isCollapsed,
),
]
);
}
}
底部欄:
class BottomNavBar extends StatefulWidget {
final int activeTabIndex;
final bool isCollapsed;
const BottomNavBar({Key? key, required this.activeTabIndex, required this.isCollapsed})
: super(key: key);
@override
BottomNavBarState createState() => BottomNavBarState();
}
class BottomNavBarState extends State<BottomNavBar> {
@override
Widget build(BuildContext context) {
Scaffold(
body: SlidingUpPanel(
controller: _pc,
panelBuilder: (sc) {
widget.isCollapsed ? _pc.show(): _pc.hide();
return Container(
child: Center(child: Text("Panel")),
);
},
body: Text("something");
), }
}
球員:
class _PlayerPreviewState extends State<PlayerPreview> {
@override
Widget build(BuildContext context) {
final String play = 'assets/icons/play.svg';
var pageWidth = MediaQuery.of(context).size.width;
return Padding(
padding: EdgeInsets.only(top: pageWidth * .04),
child: IconButton(
onPressed: () {
widget.setCollapsed(true);
},
icon: SvgPicture.asset(play),
),
);
}
}
uj5u.com熱心網友回復:
您可以使用 setState() 包裝代碼,應用程式需要在其中檢查更改并重建。所以:
setState() {
BottomNavBarState.isCollapsed = true;
}
而且我認為最好使用“bool”而不是“var”,因為變數“isCollapsed”的型別很明顯。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/320741.html
