如何解决错误:无法在此小部件上方找到正确的提供者颤动
The following ProviderNotFoundException was thrown building RestWidgets(dirty):
Error: Could not find the correct Provider<AppData> above this RestWidgets Widget
这个小部件在 mainscreen.dart 中
--necessary imports--
class mainScreen extends StatefulWidget {
static const String idScreen = "mainScreen";
@override
_mainScreenState createState() => _mainScreenState();
}
Position currentPosition;
String address;
GlobalKey<ScaffoldState> scaffoldkey;
double bottomPadingofMap;
GoogleMapController newMapController;
class _mainScreenState extends State<mainScreen> {
Completer<GoogleMapController> _controllerMap = Completer();
GlobalKey<ScaffoldState> scaffoldKey = new GlobalKey<ScaffoldState>();
var geoLocator = Geolocator();
double bottomPadingofMap = 0;
static final CameraPosition _kGooglePlex = CameraPosition(
target: LatLng(37.42796133580664,-122.085749655962),zoom: 14.4746,);
void locatePosition() async {
Position position = await Geolocator.getCurrentPosition(
desiredAccuracy: LocationAccuracy.high);
//print("pqr");
currentPosition = position;
LatLng latLatPostion = LatLng(position.latitude,position.longitude);
CameraPosition cameraPosition =
new CameraPosition(target: latLatPostion,zoom: 14);
newMapController
.animateCamera(CameraUpdate.newCameraPosition(cameraPosition));
address = await AssistantMethods.searchCoordinateAddress(position,context);
print("This is your address :" + address);
}
@override
Widget build(BuildContext context) {
return Scaffold(
key: scaffoldkey,drawer: Container(
color: Colors.white,width: 255.0,body: RestWidgets(),);
}
}
class RestWidgets extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Stack(
children: [
GoogleMap(
padding: EdgeInsets.only(bottom: bottomPadingofMap),mapType: MapType.normal,myLocationButtonEnabled: true,initialCameraPosition: _mainScreenState._kGooglePlex,myLocationEnabled: true,zoomGesturesEnabled: true,zoomControlsEnabled: true,onMapCreated: (GoogleMapController controller) {
_mainScreenState()._controllerMap.complete(controller);
newMapController = controller;
_mainScreenState().locatePosition();
},),//Hamburger for Drawer
Positioned(
top: 45.0,left: 22.0,child: GestureDetector(
onTap: () {
scaffoldkey.currentState.openDrawer();
},child: Container(
decoration: Boxdecoration(
color: Colors.white,borderRadius: BorderRadius.circular(22.0),BoxShadow: [
BoxShadow(
color: Colors.black,blurRadius: 6.0,spreadRadius: 0.5,offset: Offset(0.7,0.7),],child: CircleAvatar(
backgroundColor: Colors.white,child: Icon(
Icons.menu,color: Colors.black,radius: 20.0,Positioned(
left: 0.0,right: 0.0,bottom: 0.0,child: Container(
height: 300.0,decoration: Boxdecoration(
color: Colors.white,borderRadius: BorderRadius.only(
topLeft: Radius.circular(10.0),topRight: Radius.circular(10.0)),BoxShadow: [
BoxShadow(
color: Colors.black,blurRadius: 16.0,child: Padding(
padding:
const EdgeInsets.symmetric(horizontal: 24.0,vertical: 10.0),child: Column(
crossAxisAlignment: CrossAxisAlignment.start,children: [
SizedBox(height: 6.0),Text(
"Hi there,",style: TextStyle(fontSize: 14.0),Text(
"Choose your destination,style: TextStyle(fontSize: 12.0),SizedBox(height: 20.0),GestureDetector(
onTap: () {
Navigator.push(
context,MaterialPageRoute(
builder: (context) => SearchScreen()));
},child: Container(
decoration: Boxdecoration(
color: Colors.white,// borderRadius: BorderRadius.only(
// topLeft: Radius.circular(10.0),// topRight: Radius.circular(10.0)),BoxShadow: [
BoxShadow(
color: Colors.black,blurRadius: 3.0,offset: Offset(0.1,0.1),child: Row(
children: [
Icon(
Icons.search,SizedBox(
width: 10.0,Text("Search Drop off")
],SizedBox(height: 24.0),Row(
children: [
Icon(
Icons.home,color: Colors.grey,SizedBox(
width: 12.0,Column(
crossAxisAlignment: CrossAxisAlignment.start,children: [
Text(allinfo.address),// Text(
// Provider.of<AppData>(context).pickUpLocation !=null ?
// Provider.of<AppData>(context).pickUpLocation.placeName
// :
// "Add Home"
// ),SizedBox(
height: 4.0,Text(
"Your home address",style: TextStyle(
color: Colors.grey[200],fontSize: 12.0),)
],SizedBox(height: 10.0),DividerWidget(),SizedBox(
height: 16.0,Row(
children: [
Icon(
Icons.work,children: [
Text(Provider.of<AppData>(context,listen: false)
.dropOfLocation
.placeName),Text(
"Your work address",);
}
}
main.dart
--imports--
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MultiProvider(providers: [
ChangeNotifierProvider(create: (_) => AppData()),child: MyApp()));
// runApp(MyApp());
}
DatabaseReference userRef =
FirebaseDatabase.instance.reference().child("users");
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
create: (context) => AppData(),child: MaterialApp(
title: "Flutter App",theme: ThemeData(
primarySwatch: Colors.blue,visualDensity: VisualDensity.adaptivePlatformDensity,initialRoute: mainScreen.idScreen,routes: {
Signup.idScreen: (context) => Signup(),login.idScreen: (context) => login(),mainScreen.idScreen: (context) => mainScreen(),},debugShowCheckedModeBanner: false,);
}
}
appData.dart
import 'package:Flutter/widgets.dart';
import 'package:tracking_app/Models/address.dart';
class AppData extends ChangeNotifier {
Address pickUpLocation,dropOfLocation;
void updatePickupLocation(Address pickUpAddress) {
pickUpLocation = pickUpAddress;
notifyListeners();
}
void updateDropOffLocation(Address dropAddress) {
dropOfLocation = dropAddress;
notifyListeners();
}
}
不知道我应该如何使用这些提供程序。按照建议,我将 body 小部件更改为另一个小部件,然后调用它(mainscreenstate 的主体现在调用 RestWidgets(),即接收更改后的值)。
我尝试过使用静态变量和 setstate() 的替代方法,但这些没有给出预期的结果。我已经绕圈子转了几个小时了,但看不到摆脱这个网络的方法。请帮助一个迷失的灵魂。如果我还有灵魂,那就是。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。