Flutter - контекст передается только одному из BottomNavigationBarItem
В моем приложении есть два
BottomNavigationBarItem
: а также .
main()
бежит и
App()
возвращается
FutureBuilder
для обработки ошибки инициализации флаттера и загрузки gif. Затем он возвращается с первой страницей, являющейся или в зависимости от статуса входа пользователя.
Navigation()
имеет
BottomNavigationBar
.
Это моя диаграмма инспектора флаттера.
Как видите, в моей навигации есть две страницы (и), но они отображаются только в моем инспекторе.
Настоящая проблема в том, что работает в
HomePage()
но не в. Мой указан в
MaterialApp
. Почему я не могу отследить контекст и получить
ThemeData
из ?
Я еще не пробовал, но есть вероятность, что
Theme.of(context).textTheme.headline1
не будет работать в
AuthPage()
или.
Код ниже.
void main() {
WidgetsFlutterBinding.ensureInitialized();
runApp(App());
}
class App extends StatelessWidget {
final Future<FirebaseApp> _initialization = Firebase.initializeApp();
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: _initialization,
builder: (context, snapshot) {
if(snapshot.connectionState != ConnectionState.done) {
return LoadingGif();
} else if(snapshot.hasError) {
print(snapshot.error);
return ErrorPage(context);
}
return MaterialApp(
title: 'My App',
theme: theme, //ThemeData theme is defined in another file
home: StreamBuilder(
stream: FirebaseAuth.instance.authStateChanges(),
builder: (context, snapshot) {
if (snapshot.hasData) {
return Navigation();
} else {
return AuthPage();
}
},
),
routes: {
'auth': (context) => AuthPage(),
'home': (context) => Navigation(),
},
);
},
);
}
}
class Navigation extends StatefulWidget {
const Navigation({Key? key}) : super(key: key);
@override
_NavigationState createState() => _NavigationState();
}
class _NavigationState extends State<Navigation> {
int _selectedIndex = 0;
@override
Widget build(BuildContext context) {
return Scaffold(
body: _widgetOptions.elementAt(_selectedIndex),
bottomNavigationBar: BottomNavigationBar(
type: BottomNavigationBarType.fixed,
items: [
BottomNavigationBarItem(
label: 'Home',
icon: Icon(Icons.home_outlined, size: 36)
),
BottomNavigationBarItem(
label: 'My Page',
icon: Icon(Icons.account_circle_outlined, size: 36)
)
],
onTap: (int index) {
setState(() {
_selectedIndex = index;
});
},
),
);
}
List _widgetOptions = [
HomePage(),
UserPage()
];
}
Это
UserPage()
.
class UserPage extends StatelessWidget {
UserPage({Key? key}) : super(key: key);
UserProfileHandler _userProfileHandler = new UserProfileHandler();
@override
Widget build(BuildContext context) {
final Size size = MediaQuery.of(context).size;
return Scaffold(
appBar: TopBar(
pageTitle: '내 정보',
actionList: <Widget>[
IconButton(
onPressed: () {
Navigator.push(context, MaterialPageRoute(builder: (context) => SettingsPage()));
},
icon: Icon(Icons.settings),
)
]
),
body: SingleChildScrollView(
child: Column(
children: [
UserTapBody(),
Divider(),
]
),
)
);
}
Widget UserTapBody() {
return StreamBuilder(
stream: _userProfileHandler.userProfileStream(),
builder: (context, snapshot) {
//error, loading
if (snapshot.hasError) {
print(snapshot.error);
return Center(child: ErrorPage(context));
} else if (snapshot.connectionState == ConnectionState.waiting) {
return LoadingGif();
}
UserProfile userProfile = snapshot.data as UserProfile;
return DefaultTabController(
length: 3, // length of tabs
initialIndex: 0,
child: ListView(
shrinkWrap: true,
children: <Widget>[
const TabBar(
labelColor: brandColor,
labelStyle: TextStyle(
fontSize: 20,
fontWeight: FontWeight.bold
),
indicatorColor: brandColor,
unselectedLabelColor: Colors.black,
unselectedLabelStyle: TextStyle(fontWeight: FontWeight.normal),
tabs: [
Tab(text: '회원 정보'),
Tab(text: '만남 내역'),
Tab(text: '멘토 정보'),
],
),
Container(
height: 500, //height of TabBarView
child: TabBarView(
children: <Widget>[
UserDetail(context, userProfile),
Container(
child: Center(
child: Text('만남 내역', style: TextStyle(
fontSize: 22, fontWeight: FontWeight.bold)),
),
),
Container(
child: Center(
child: Text('멘토 정보', style: TextStyle(
fontSize: 22, fontWeight: FontWeight.bold)),
),
),
]
)
)
]
)
);
}
);
}
Widget UserDetail(context, userProfile) {
return Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Row(
children: [ // These are the ones that Theme.of(context) doesn't work
Text('자기소개', style: Theme.of(context).textTheme.caption),
Spacer(),
EditTextButton(context: context, editPage: editIntro(userProfile: userProfile))
],
),
Html(data: userProfile.intro ?? ""),
Text('이력 및 경험', style: Theme.of(context).textTheme.caption,),
Html(data: userProfile.exp ?? ""),
Text('저서', style: Theme.of(context).textTheme.caption,),
Html(data: userProfile.pub ?? ""),
]
),
);
}
}