从不同的屏幕导航到底部导航栏中的屏幕并重新加载状态

时间:2021-03-23 16:38:09

标签: android flutter dart flutter-layout flutter-dependencies

我一直在用 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",
          ),
      ),
   ),
 ),
}

0 个答案:

没有答案