Flutter - нижняя панель навигации не отображает текущую вкладку

Я изучаю трепетание. Я хочу сделать приложение с нижней панелью навигации. Я построил нижнюю панель навигации с 5 вкладками. одна из них - вкладка профиля. мой сценарий: когда я нажимаю на вкладку профиля, мое приложение проверяет, вошел ли пользователь в систему или нет. если пользователь не вошел в систему, мое приложение будет перенаправлено на страницу входа в систему с использованием Navigator.push(), а из страницы входа в систему оно будет перенаправлено обратно со значением true в случае успешного входа и false в случае неудачного входа в систему или нажатия кнопки «Назад» на панели приложения.

после этого в ProfilePage проверка true отобразит профиль, а false перенаправит на предыдущую страницу.

Я использую rxdart и BehaviourSubject для изменения страницы индекса. Мне удалось изменить индекс вкладки и тело вкладки. но мое приложение не отображает текущее тело (предыдущая вкладка перед вкладкой профиля касания)

Main.dart

import 'package:flutter/material.dart';
import 'package:usahaku_flutter/pages/HomePage.dart';
import 'package:usahaku_flutter/pages/ChatPage.dart';
import 'package:usahaku_flutter/pages/TransactionPage.dart';
import 'package:usahaku_flutter/pages/ProfilePage.dart';
import 'package:usahaku_flutter/pages/ShopPage.dart';
import './services/locator_service.dart';
import './blocs/NavTab.dart';

void main() {
  setup();
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return MyAppState();
  }
}

class MyAppState extends State<MyApp> {
  final _pageOption = [
    HomePage(),
    ChatPage(),
    UserProfile(),
    TransactionPage(),
    ShopPage(),
  ];
  int _currentTabIndex = 0;
  var _currentPage;
  @override
  initState() {
    super.initState();
    _currentPage = _pageOption[_currentTabIndex];
    sl.get<NavTab>().subject_currentTab.listen((data) {
      _currentTabIndex = data;
      _currentPage = _pageOption[_currentTabIndex];
      print(_currentPage);
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        title: 'UsahaKu',
        theme: ThemeData(primarySwatch: Colors.brown),
        home: SafeArea(
          child: Scaffold(
            body: _currentPage,
            bottomNavigationBar: BottomNavigationBar(
                fixedColor: Colors.black87,
                currentIndex: _currentTabIndex,
                type: BottomNavigationBarType.fixed,
                items: [
                  BottomNavigationBarItem(
                    icon: Icon(Icons.home),
                    title: Text('Home'),
                  ),
                  BottomNavigationBarItem(
                    icon: Icon(Icons.chat),
                    title: Text('Chat'),
                  ),
                  BottomNavigationBarItem(
                    icon: Icon(Icons.person),
                    title: Text('Profile'),
                  ),
                  BottomNavigationBarItem(
                    icon: Icon(Icons.transform),
                    title: Text('Transaksi'),
                  ),
                  BottomNavigationBarItem(
                    icon: Icon(Icons.business_center),
                    title: Text('Toko'),
                  ),
                ],
                onTap: (index) {
                  setState(() {
                    sl.get<NavTab>().changeTab(index);
                  });
                }),
          ),
        ));
  }
}

NavTab.dart

import 'package:rxdart/rxdart.dart';

class NavTab {
  BehaviorSubject<int> subject_currentTab = new BehaviorSubject<int>();
  BehaviorSubject<int> subject_previousTab = new BehaviorSubject<int>();

  // Observable<int> currentTab;
  // Observable<int> previousTab;

  NavTab() {
    // currentTab = new Observable(subject_currentTab);
    // previousTab = new Observable(subject_previousTab);
    subject_currentTab.add(0);
    subject_previousTab.add(null);
  }

  void changeTab(int c) {
    var cr = subject_currentTab.value;
    var pr = subject_previousTab.value;
    if (cr != pr) {
      subject_previousTab.add(cr);
      subject_currentTab.add(c);
    }else{
      subject_currentTab.add(c);
    }
  }

  void backToPreviousTab() {
    var r = subject_previousTab.value;
    subject_currentTab.add(r);
  }
}

ProfilePage.dart

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:usahaku_flutter/services/Auth.dart';
import 'package:usahaku_flutter/services/locator_service.dart';
import './LoginPage.dart';
import '../blocs/NavTab.dart';

class UserProfile extends StatefulWidget {
  @override
  UserProfileState createState() => UserProfileState();
}

class UserProfileState extends State<UserProfile> {
  Map<String, dynamic> _profile;
  StreamSubscription _profileSubs = null;

  @override
  initState() {
    super.initState();
    print('constructor');
    print('profile page');
    _profileSubs = sl.get<AuthService>().profile.listen((state) => setState(() {
          print('constructor');
          print('state');
          print(state);
          if (state == null) {
            print('navigate to loginpage');
            Navigator.push(context,
                MaterialPageRoute(builder: (context) => LoginPage())).then((t) {
              if (t == false) {
                sl.get<NavTab>().backToPreviousTab();
              }
            });
          } else {
            _profile = state;
          }
        }));
  }

  @override
  void dispose() {
    _profileSubs.cancel();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Profile'),
      ),
      body: Column(
        children: <Widget>[
          Text(_profile.toString()),
          MaterialButton(
            onPressed: () => sl.get<AuthService>().signOut(),
            child: Text('Logout'),
          )
        ],
      ),
    );
  }
}

LoginPage.dart

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:rxdart/rxdart.dart';
import 'package:usahaku_flutter/services/Auth.dart';
import '../services/locator_service.dart';

class LoginPage extends StatefulWidget {
  @override
  LoginPageState createState() => LoginPageState();
}

class LoginPageState extends State<LoginPage> {
  Observable _profileSubs = null;

  @override
  initState() {
    super.initState();
    _profileSubs = sl.get<AuthService>().user.switchMap((u) {
      if (u != null) {
        Navigator.pop(context, true);
      }
    });
  }

  @override
  void dispose() {
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          leading: IconButton(
            icon: Icon(Icons.chevron_left),
            onPressed: () => Navigator.pop(context, false),
          ),
          title: Text('Login'),
        ),
        body: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          mainAxisSize: MainAxisSize.max,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: <Widget>[
            MaterialButton(
              onPressed: () {
                sl.get<AuthService>().googleSignIn().then((value) {
                  if (value != null) {
                    Navigator.pop(context, true);
                  }
                });
              },
              child: Row(
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                crossAxisAlignment: CrossAxisAlignment.center,
                mainAxisSize: MainAxisSize.min,
                children: <Widget>[Icon(Icons.get_app), Text('Login')],
              ),
            )
          ],
        ));
  }
}


person Sulaiman Triarjo    schedule 15.05.2019    source источник


Ответы (1)


Я решил это случайно, изменив код

из

 sl.get<NavTab>().subject_currentTab.listen((data) {
      _currentTabIndex = data;
      _currentPage = _pageOption[_currentTabIndex];
      print(_currentPage);
    });

to

 sl.get<NavTab>().subject_currentTab.listen((data) {
      setState(() {
        _currentTabIndex = data;
        _currentPage = _pageOption[_currentTabIndex];
      });
    });
person Sulaiman Triarjo    schedule 15.05.2019