Я изучаю трепетание. Я хочу сделать приложение с нижней панелью навигации. Я построил нижнюю панель навигации с 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')],
),
)
],
));
}
}