是否可以在不使用 "widget." 的情况下使用 Statefulwidget 中另一个页面的传递数据
Is that possible to use the passing data form another page in Statefulwidget without using "widget."
你好,我是这个工具的新手,希望得到你的帮助。让我来解释一下要做什么,我有一个 Nav()
Statefulwidget 传递 bool
形成另一个页面来检查现在使用该应用程序的人是“用户”还是“访客”并且在Nav()
我使用 BottomNavigationBarItem 小部件。现在的问题是 BottomNavigationBarItem 需要在 BuildContext
之外创建列表,并且列表中包含需要导航的页面。我有一个名为 Profile()
的页面也需要传递 bool
来检查用户状态,我想使用已经传递的 bool user
将数据传递给 Profile()
页面,但看起来我无法在 BuildContext
之外调用 user
。我什至使用 widget.user
但它仍然收到错误消息
"The instance member 'widget' can't be accessed in initializer.
尝试用不同的表达式替换对实例成员的引用"
无论如何,我可以在 BuildContext
之外调用 user
吗?
所以如果有人能帮助我,我将不胜感激。
代码如下:
class Nav extends StatefulWidget {
const Nav({Key? key, required this.user}) : super(key: key);
final bool user;
@override
_NavState createState() => _NavState();
}
class _NavState extends State<Nav> {
int _selectedIndex = 0;
final bool _user = widget.user;
final List<Widget> _widgetOptions = <Widget>[
Home(),
News(),
Timeline(),
Manual(),
Profile(user: _user),
];
void _onItemTap(int index) {
setState(() {
_selectedIndex = index;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: IndexedStack(
index: _selectedIndex,
children: _widgetOptions,
),
),
bottomNavigationBar: BottomNavigationBar(
type: BottomNavigationBarType.fixed,
backgroundColor: const Color(0xFF20348F),
selectedItemColor: Colors.amber,
unselectedItemColor: Colors.white54,
items: [
bottomNav(const Icon(Icons.home), 'Home'),
bottomNav(const Icon(Icons.line_style_outlined), 'News'),
bottomNav(const Icon(Icons.location_pin), 'Timeline'),
bottomNav(const Icon(Icons.my_library_books_outlined), 'Manual'),
bottomNav(const Icon(Icons.person), 'Profile'),
],
currentIndex: _selectedIndex,
onTap: _onItemTap,
selectedFontSize: 15.0,
),
);
}
}
BottomNavigationBarItem bottomNav(Icon Icon, String Txt) {
return BottomNavigationBarItem(icon: Icon, label: Txt);
}
如果你使用的是空安全版本,你可以像这样初始化它们。
class _NavState extends State<Nav> {
int _selectedIndex = 0;
late bool _user;
late List<Widget> _widgetOptions;
@override
void initState() {
_user = widget.user;
_widgetOptions = <Widget>[
Home(),
News(),
Timeline(),
Manual(),
Profile(user: _user),
];
super.initState();
}
此外,我强烈建议您使用枚举而不是布尔来指定用户类型。
你好,我是这个工具的新手,希望得到你的帮助。让我来解释一下要做什么,我有一个 Nav()
Statefulwidget 传递 bool
形成另一个页面来检查现在使用该应用程序的人是“用户”还是“访客”并且在Nav()
我使用 BottomNavigationBarItem 小部件。现在的问题是 BottomNavigationBarItem 需要在 BuildContext
之外创建列表,并且列表中包含需要导航的页面。我有一个名为 Profile()
的页面也需要传递 bool
来检查用户状态,我想使用已经传递的 bool user
将数据传递给 Profile()
页面,但看起来我无法在 BuildContext
之外调用 user
。我什至使用 widget.user
但它仍然收到错误消息
"The instance member 'widget' can't be accessed in initializer.
尝试用不同的表达式替换对实例成员的引用"
无论如何,我可以在 BuildContext
之外调用 user
吗?
所以如果有人能帮助我,我将不胜感激。
代码如下:
class Nav extends StatefulWidget {
const Nav({Key? key, required this.user}) : super(key: key);
final bool user;
@override
_NavState createState() => _NavState();
}
class _NavState extends State<Nav> {
int _selectedIndex = 0;
final bool _user = widget.user;
final List<Widget> _widgetOptions = <Widget>[
Home(),
News(),
Timeline(),
Manual(),
Profile(user: _user),
];
void _onItemTap(int index) {
setState(() {
_selectedIndex = index;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: IndexedStack(
index: _selectedIndex,
children: _widgetOptions,
),
),
bottomNavigationBar: BottomNavigationBar(
type: BottomNavigationBarType.fixed,
backgroundColor: const Color(0xFF20348F),
selectedItemColor: Colors.amber,
unselectedItemColor: Colors.white54,
items: [
bottomNav(const Icon(Icons.home), 'Home'),
bottomNav(const Icon(Icons.line_style_outlined), 'News'),
bottomNav(const Icon(Icons.location_pin), 'Timeline'),
bottomNav(const Icon(Icons.my_library_books_outlined), 'Manual'),
bottomNav(const Icon(Icons.person), 'Profile'),
],
currentIndex: _selectedIndex,
onTap: _onItemTap,
selectedFontSize: 15.0,
),
);
}
}
BottomNavigationBarItem bottomNav(Icon Icon, String Txt) {
return BottomNavigationBarItem(icon: Icon, label: Txt);
}
如果你使用的是空安全版本,你可以像这样初始化它们。
class _NavState extends State<Nav> {
int _selectedIndex = 0;
late bool _user;
late List<Widget> _widgetOptions;
@override
void initState() {
_user = widget.user;
_widgetOptions = <Widget>[
Home(),
News(),
Timeline(),
Manual(),
Profile(user: _user),
];
super.initState();
}
此外,我强烈建议您使用枚举而不是布尔来指定用户类型。