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 ?? ""),
          ]
      ),
    );
  }
}

0 ответов

Другие вопросы по тегам