我一直在用 Flutter 创建一个应用程序,我被这个问题困住了。我的底部导航栏中有 5 个项目,其中两个是 HomeSreen 和 AddCashScreen。 HomeScreen 是我的应用程序中的主屏幕,它由一些重要的 API 组成,这些 API 在我们一开始进入此页面时会起作用。
AddCashScreen 上有一个 Button("Proceed to add cash"),如果我们点击它,就会运行一个 API,在服务器端记录成功后,用户应该回到 HomeScreen 页面并且HomeScreen 中的所有 API 都必须再次运行(这很重要)。
这就是问题发生的地方,点击按钮后,用户仍然在 AddCashScreen 上,但在 HomeScreen 中可以看到一个新的导航栏(由相同的项目组成)。我不知道如何解决问题。如果有人可以帮忙,请看一看。 (PS:我是 Flutter 新手)
这是主屏幕:
class HomeScreen extends StatefulWidget {
@override
HomeScreenState createState() =>
new HomeScreenState(_user, _googleSignIn, landingPage);
}
class HomeScreenState extends State<HomeScreen> {
int landingPage = 0;
int currentIndex;
HomeScreenState();
List<GlobalKey<NavigatorState>> _navigatorKeys = [
GlobalKey<NavigatorState>(),
GlobalKey<NavigatorState>(),
GlobalKey<NavigatorState>(),
GlobalKey<NavigatorState>(),
GlobalKey<NavigatorState>(),
];
getValueForDisplayNAme() {
if (_user == null) {
displayName = "";
}
}
@override
Widget build(BuildContext context) {
void onTabTapped(int index) {
setState(() {
currentIndex = index;
});
}
return WillPopScope(
onWillPop: () async {
final isFirstRouteInCurrentTab =
!await _navigatorKeys[currentIndex].currentState.maybePop();
// let system handle back button if we're on the first route
return isFirstRouteInCurrentTab;
},
child: MultiProvider(
providers: [
ChangeNotifierProvider(create: (context) => AddCashValue()),
],
child: Scaffold(
body: Stack(
children: [
_buildOffstageNavigator(0),
_buildOffstageNavigator(1),
_buildOffstageNavigator(2),
_buildOffstageNavigator(3),
_buildOffstageNavigator(4),
],
),
bottomNavigationBar: _createBottomNavigationBar()),
));
// TODO: implement build
}
Route _createRoute(route) {
return PageRouteBuilder(
pageBuilder: (context, animation, secondaryAnimation) => route(),
transitionsBuilder: (context, animation, secondaryAnimation, child) {
return child;
},
);
}
Widget _createBottomNavigationBar() {
return Container(
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [blue1, dark1],
begin: Alignment.topLeft,
end: Alignment.bottomLeft,
stops: [0.0, 0.8],
tileMode: TileMode.clamp,
),
),
child: BottomNavigationBar(
currentIndex: currentIndex,
onTap: (index) {
print("index : " + index.toString());
setState(() {
currentIndex = index;
});
},
showUnselectedLabels: true,
backgroundColor: Colors.transparent,
type: BottomNavigationBarType.fixed,
fixedColor: Colors.white,
unselectedIconTheme: IconThemeData(color: Colors.blue),
unselectedItemColor: Colors.blue,
selectedFontSize: 12.0,
unselectedFontSize: 12.0,
elevation: 50.0,
selectedIconTheme: IconThemeData(color: Colors.white),
items: [
BottomNavigationBarItem(
icon: Padding(
padding: const EdgeInsets.all(5.0),
child: new Image.asset('assets/images/all_game.png',
fit: BoxFit.contain),
),
// ignore: deprecated_member_use
title: Text("All Games"),
),
BottomNavigationBarItem(
icon: Padding(
padding: const EdgeInsets.all(5.0),
child: new Image.asset('assets/images/deals.png',
fit: BoxFit.contain),
),
title: Text("Deals"),
),
BottomNavigationBarItem(
icon: Padding(
padding: const EdgeInsets.all(5.0),
child: new Image.asset('assets/images/add_cash.png',
fit: BoxFit.contain),
),
// ignore: deprecated_member_use
title: Text("Add Cash"),
),
BottomNavigationBarItem(
icon: Padding(
padding: const EdgeInsets.all(5.0),
child: new Image.asset('assets/images/refer.png',
fit: BoxFit.contain),
),
// ignore: deprecated_member_use
title: Text("Refer and Earn"),
),
BottomNavigationBarItem(
icon: Padding(
padding: const EdgeInsets.all(5.0),
child: new Image.asset('assets/images/chat.png',
fit: BoxFit.contain),
),
// ignore: deprecated_member_use
title: Text("Support"),
)
],
),
);
}
Map<String, WidgetBuilder> _routeBuilders(BuildContext context, int index) {
return {
'/': (context) {
return [
AllGamesScreen(),
DealsScreen(),
AddCash(),
ReferAndEarnScreen(),
SupportScreen(),
].elementAt(index);
},
};
}
Widget _buildOffstageNavigator(int index) {
var routeBuilders = _routeBuilders(context, index);
return Offstage(
offstage: currentIndex != index,
child: Navigator(
key: _navigatorKeys[index],
onGenerateRoute: (routeSettings) {
return MaterialPageRoute(
builder: (context) => routeBuilders[routeSettings.name](context),
);
},
),
);
}
noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
}
这是我的 AddCashScreen:
class AddCash extends StatefulWidget {
AddCash();
@override
_AddCashState createState() => _AddCashState(_user, _googleSignIn);
}
class _AddCashState extends State<AddCash> {
@override
Widget build(BuildContext context) {
return Scaffold(
resizeToAvoidBottomInset: false,
body: Container(
child: GestureDetector(
onTap: () {
//API call
//After success {
Navigator.pushAndRemoveUntil(
context,
MaterialPageRoute(
builder: (BuildContext context) =>
HomeScreen(),
),
(route) => true,
);
}
},
child: Text(
"Proceed to Add Cash",
),
),
),
),
}