问题描述
我正在尝试访问此控制器,但我不知道它为什么会崩溃。他给我的错误是:
没有找到材料小部件 iconButtonwidget 需要一个材质小部件
我是否错误地初始化了视图?
谁能告诉我我做错了什么?
这是我使用的代码
class MapTab extends StatefulWidget {
@override
_MapTabState createState() => _MapTabState();
}
class _MapTabState extends State<MapTab> {
Size _size;
MapBoxMapController _mapController;
StreamController<Restaurant> _bottomCardStreamController;
_onMapCreated(MapBoxMapController controller) {
_mapController = controller;
contentManager.getMerchants().then(
(restaurants) => restaurants.forEach(
(restaurant) => controller.addSymbol(
SymbolOptions(
geometry: LatLng(double.parse(restaurant.coordinates.lat),double.parse(restaurant.coordinates.long)),iconImage: "assets/images/map_pin.png",),restaurant.toJson(),);
controller.onSymbolTapped.add((symbol) async {
Restaurant restaurant = Restaurant.fromJson(symbol.data);
_toggleBottomCard(restaurant);
});
_bottomCardStreamController.stream.listen((restaurant) {
if (restaurant == null) return;
List<CameraUpdate> updates = [
CameraUpdate.zoomTo(15),CameraUpdate.newLatLng(LatLng(
double.parse(restaurant.coordinates.lat),double.parse(restaurant.coordinates.long),)),];
updates
.forEach((element) async => await controller.animateCamera(element));
});
}
_toggleBottomCard(Restaurant data) {
_bottomCardStreamController.sink.add(data);
}
@override
void initState() {
super.initState();
_bottomCardStreamController = StreamController<Restaurant>.broadcast();
}
@override
void dispose() {
_bottomCardStreamController.close();
super.dispose();
}
@override
Widget build(BuildContext context) {
_size = MediaQuery.of(context).size;
return Stack(
alignment: AlignmentDirectional.center,children: [
FutureBuilder<Position>(
future: PositionService.getCurrentPosition(),builder: (context,AsyncSnapshot<Position> positionSnap) {
if (positionSnap.hasError)
return Center(
child: Text(localization.err_localization),);
if (positionSnap.connectionState != ConnectionState.done)
return Container(
child: Center(
child: CircularProgressIndicator(valueColor: new AlwaysstoppedAnimation<Color>(appColors.yellow)),);
var data = positionSnap.data;
var latLng = LatLng(data.latitude,data.longitude);
return FutureBuilder<String>(
future: contentManager.getMapBoxKey(),tokenSnap) {
if (tokenSnap.hasError)
return Container(
child: Center(
child: Text(localization.err_mapBox_key),);
if (tokenSnap.connectionState != ConnectionState.done)
return Container(
child: Center(
child: CircularProgressIndicator(valueColor: new AlwaysstoppedAnimation<Color>(appColors.yellow)),);
return Container(
height: _size.height,width: _size.width,child: MapBoxMap(
rotateGesturesEnabled: false,myLocationEnabled: true,onStyleLoadedCallback: () {},zoomGesturesEnabled: true,onMapClick: (_,__) {
// fa scomparire la bottomCard
_bottomCardStreamController.sink.add(null);
},accesstoken: tokenSnap.data,onMapCreated: _onMapCreated,compassEnabled: false,initialCameraPosition: CameraPosition(
target: latLng,zoom: 15,bearing: 0,tilt: 0,);
});
}),Positioned(
bottom: 10,right: 10,height: 50,width: 50,child: GestureDetector(
child: Container(
decoration: Boxdecoration(
color: Color.fromARGB(255,255,255),shape: BoxShape.circle,child: Icon(Icons.my_location),onTap: () async {
var position = await PositionService.getCurrentPosition();
var latLng = LatLng(position.latitude,position.longitude);
_mapController.animateCamera(CameraUpdate.newLatLng(latLng));
},Positioned(
top: 10,left: 0,child: Row(
mainAxisSize: MainAxisSize.min,children: [
IconButton(
icon: Icon(
Icons.list,onpressed: () {},Flexible(
child: GestureDetector(
onTap: () async {
await showSearch<Restaurant>(
context: context,delegate: CustomSearchDelegate(),query: "",).then(
(value) => _bottomCardStreamController.sink.add(value),);
},child: Container(
decoration: Boxdecoration(
color: Colors.white,borderRadius: BorderRadius.circular(20),child: Padding(
padding: EdgeInsets.symmetric(
horizontal: 3,vertical: 2,child: TextField(
enabled: false,decoration: Inputdecoration(
icon: Icon(
Icons.search,color: Colors.grey,hintText: localization.find,border: InputBorder.none,IconButton(
icon: Icon(
Icons.filter_alt,)
],Positioned(
bottom: 25,child: StreamBuilder<Restaurant>(
stream: _bottomCardStreamController.stream,builder: (_,snap) {
if (snap.data == null)
return Container();
else
return RestaurantMapCard(snap.data,mapController: _mapController);
},],);
}
}
解决方法
用 MaterialApp
小部件包裹您的根(第一个小部件)。
Widget build(BuidContext context){
return MaterialApp(
home: Stack() // your stack and other widgets are here.
);
}