构建一个多自动售货机杂货店应用程序。代码运行得很好,但是当我添加persistent_bottom_nav_bar插件并使用PersistentTabView作为底部导航器时,我的控制台中出现Could not find a generator for route RouteSettings("map-screen", null) in the _CustomTabViewState
错误。
每次单击按钮时都会出现此错误。
同样,当我单击“退出”按钮时,我得到此错误Could not find a generator for route RouteSettings("welcome-screen", null) in the _CustomTabViewState.
下面是我的main.dart
代码
import 'dart:async';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';
import 'package:multi_vending_grocery_app/providers/auth_provider.dart';
import 'package:multi_vending_grocery_app/providers/location_provider.dart';
import 'package:multi_vending_grocery_app/providers/store_provider.dart';
import 'package:multi_vending_grocery_app/screens/home_screen.dart';
import 'package:multi_vending_grocery_app/screens/landing_screen.dart';
import 'package:multi_vending_grocery_app/screens/login_screen.dart';
import 'package:multi_vending_grocery_app/screens/main_screen.dart';
import 'package:multi_vending_grocery_app/screens/map_screen.dart';
import 'package:multi_vending_grocery_app/screens/register_screen.dart';
import 'package:multi_vending_grocery_app/screens/splash_screen.dart';
import 'package:multi_vending_grocery_app/screens/welcome_screen.dart';
import 'package:provider/provider.dart';
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(
MultiProvider(
providers: [
ChangeNotifierProvider(
create: (_) => AuthProvider(),
),
ChangeNotifierProvider(
create: (_) => LocationProvider(),
),
ChangeNotifierProvider(
create: (_) => StoreProvider(),
),
],
child: const MyApp(),
),
);
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
initialRoute: SplashScreen.id,
routes: {
SplashScreen.id: (context) => const SplashScreen(),
HomeScreen.id: (context) => const HomeScreen(),
WelcomeScreen.id: (context) => const WelcomeScreen(),
MapScreen.id: (context) => const MapScreen(),
LoginScreen.id: (context) => const LoginScreen(),
RegistrationScreen.id: (context) => const RegistrationScreen(),
LandingScreen.id: (context) => const LandingScreen(),
MainScreen.id: (context) => const MainScreen(),
},
debugShowCheckedModeBanner: false,
theme: ThemeData(primarySwatch: Colors.deepPurple, fontFamily: 'Lato'),
);
}
}
下面是我的profile_screen.dart
代码
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:multi_vending_grocery_app/screens/welcome_screen.dart';
class ProfileScreen extends StatelessWidget {
const ProfileScreen({Key? key}) : super(key: key);
static const String id = 'profile-screen';
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Center(
child: Text("Profile Section"),
),
ElevatedButton(onPressed: () {
FirebaseAuth.instance.signOut();
Navigator.pushReplacementNamed(context, WelcomeScreen.id);
}, child: const Text("Sign-Out"))
],
));
}
}
下面是我的welcome_screen.dart
代码
import 'package:flutter/material.dart';
import 'package:multi_vending_grocery_app/providers/auth_provider.dart';
import 'package:multi_vending_grocery_app/providers/location_provider.dart';
import 'package:multi_vending_grocery_app/screens/map_screen.dart';
import 'package:multi_vending_grocery_app/screens/on_board_screen.dart';
import 'package:provider/provider.dart';
class WelcomeScreen extends StatefulWidget {
const WelcomeScreen({Key? key}) : super(key: key);
static const String id = 'welcome-screen';
@override
State<WelcomeScreen> createState() => _WelcomeScreenState();
}
class _WelcomeScreenState extends State<WelcomeScreen> {
@override
Widget build(BuildContext context) {
final auth = Provider.of<AuthProvider>(context);
final Size size = MediaQuery.of(context).size;
TextEditingController _phoneNumberController = TextEditingController();
final locationData = Provider.of<LocationProvider>(context, listen: false);
bool _validPhoneNumber = false;
void showBottomSheet(context) {
showModalBottomSheet(
context: context,
builder: (BuildContext context) {
return StatefulBuilder(
builder: (BuildContext context, StateSetter stateSetter) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Padding(
padding: EdgeInsets.only(top: 20.0, left: 20),
child: Text(
"Login",
style:
TextStyle(fontSize: 25, fontWeight: FontWeight.bold),
),
),
const Padding(
padding: EdgeInsets.only(top: 5.0, left: 20),
child: Text(
"Enter Your Phone Number",
style: TextStyle(fontSize: 18, color: Colors.grey),
),
),
Padding(
padding:
const EdgeInsets.only(top: 8.0, left: 20, right: 20),
child: TextField(
controller: _phoneNumberController,
maxLength: 10,
style: const TextStyle(fontSize: 20),
keyboardType: TextInputType.phone,
decoration: const InputDecoration(
prefix: Text(
"+91 ",
style: TextStyle(fontSize: 20),
),
labelText: "Enter Your Phone Number",
),
autofocus: true,
onChanged: (value) {
if (value.length == 10) {
stateSetter(() {
_validPhoneNumber = true;
});
} else {
stateSetter(
() {
_validPhoneNumber = false;
},
);
}
},
),
),
Row(
children: [
Expanded(
child: SizedBox(
height: size.height / 18,
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 20),
child: AbsorbPointer(
absorbing: _validPhoneNumber ? false : true,
child: ElevatedButton(
style: ButtonStyle(
backgroundColor: _validPhoneNumber
? MaterialStateProperty.all(
Colors.deepPurple)
: MaterialStateProperty.all(
Colors.grey)),
onPressed: () {
stateSetter(() {
auth.isLoading = true;
});
String number =
'+91${_phoneNumberController.text}';
auth.verifyPhoneNumber(
context: context,
number: number,
// latitude: null,
// longitude: null,
// address: null
);
// auth.isLoading = false;
},
child: auth.isLoading
? const Center(
child: CircularProgressIndicator(
valueColor:
AlwaysStoppedAnimation<Color>(
Colors.white),
),
)
: Text(
_validPhoneNumber
? "Continue"
: "Enter Phone Number",
style: const TextStyle(
fontSize: 20,
),
),
),
),
),
),
)
],
)
],
);
},
);
},
);
}
return Container(
color: Colors.deepPurpleAccent,
child: SafeArea(
child: Scaffold(
body: SizedBox(
child: Stack(
children: [
Align(
alignment: Alignment.topRight,
child: Container(
height: size.height / 10,
width: size.width / 3.5,
alignment: Alignment.center,
decoration: const BoxDecoration(
color: Color.fromRGBO(178, 182, 231, 1.0),
borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(1000),
),
),
child: InkWell(
onTap: () {},
child: Icon(
Icons.arrow_forward,
size: size.width / 12,
),
),
),
),
Column(
children: [
const Expanded(child: OnBoardScreen()),
const Text(
"Ready to Order from your Nearest Shop?",
style:
TextStyle(fontSize: 18, fontWeight: FontWeight.w300),
),
SizedBox(
height: size.height / 45,
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Text("New User?",style: TextStyle(fontSize: 20,fontWeight: FontWeight.bold),),
SizedBox(height: 50,child: Image.asset('assets/forward_arrow.gif')),
TextButton(
style: ButtonStyle(
elevation: MaterialStateProperty.all(1),
backgroundColor: MaterialStateProperty.all(
const Color.fromRGBO(178, 182, 231, 1.0),
)),
onPressed: () async {
setState(() {
locationData.isLoading = true;
});
await locationData.getMyCurrentPosition();
if (locationData.permissionAllowed) {
Navigator.pushReplacementNamed(context, MapScreen.id);
setState(() {
locationData.isLoading = false;
});
} else {
setState(() {
locationData.isLoading = false;
});
}
},
child: locationData.isLoading
? const Center(
child: CircularProgressIndicator(
valueColor:
AlwaysStoppedAnimation<Color>(Colors.white),
),
)
: const Text(
"Set Location",
style: TextStyle(
color: Colors.black,
fontSize: 16,
),
),
),
],
),
SizedBox(
height: size.height / 45,
),
TextButton(
onPressed: () {
setState(() {
auth.screen = "Login";
});
showBottomSheet(context);
},
child: RichText(
text: const TextSpan(
text: "Already a customer?",
children: [
TextSpan(
text: " Login",
style: TextStyle(
fontSize: 17,
color: Colors.deepPurpleAccent,
fontWeight: FontWeight.w500))
],
style: TextStyle(fontSize: 15, color: Colors.black87),
),
),
),
SizedBox(
height: size.height / 30,
),
],
),
],
),
),
),
),
);
}
}
2条答案
按热度按时间9lowa7mx1#
您必须为特定PersistentBottomNavBarItem显式提供路由设置,才能从该页面导航。
例如:在您的PersistentTabView中,您有一个导航到HomeScreen()的“主页”选项卡。现在您要从HomeScreen()导航到ProfileScreen(),则必须在PersistentBottomNavBarItem中提供一个路由设置。
现在,您可以从HomeScreen()调用**Navigator.pushNamed(context,“/profile”)**来导航到ProfileScreen()。
mitkmikd2#
是的@Sizajul Islam说的对
您可以浏览任何您正在使用的导航栏。它必须具有类似routes或onGenerateRoutes的属性。为路线创建一个单独的类,然后在导航中调用它们。
对于CupertinoTabBar****返回CupertinoTabView(路径:appRoutes,//或onGenerateRoutes(生成路由):***
与上述类似,在导航中设置路线: