我将Google Maps小部件添加到SliverAppBar,并且在滚动此视图时动画开始滞后。 https://www.dropbox.com/s/mg3hg4lb7kvxsao/RPReplay_Final1561960489.mp4?dl=0您能解释一下为什么动画滞后以及如何解决吗?
我尝试使用SingleTickerProviderStateMixin使此动画更平滑,但仍然没有结果
class AnimatedGoogleMaps extends StatefulWidget {
const AnimatedGoogleMaps({
Key key,
@required CameraPosition kGooglePlex,
@required Completer<GoogleMapController> controller,
})
: _kGooglePlex = kGooglePlex,
_controller = controller,
super(key: key);
final CameraPosition _kGooglePlex;
final Completer<GoogleMapController> _controller;
@override
_AnimatedGoogleMapsState createState() =>
_AnimatedGoogleMapsState();
}
class _AnimatedGoogleMapsState extends State<AnimatedGoogleMaps>
with SingleTickerProviderStateMixin {
AnimationController animation;
@override
void initState() {
super.initState();
animation = AnimationController(
vsync: this,
duration: Duration(seconds: 10),
);
animation.addListener(() {
this.setState(() {});
});
}
@override
void dispose() {
animation.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return GoogleMap(
mapType: MapType.normal,
initialCameraPosition: PageStateProvider
.getInstance()
.position ??
widget._kGooglePlex,
gestureRecognizers: Set()
..add(Factory<VerticalDragGestureRecognizer>(
() => VerticalDragGestureRecognizer())),
zoomGesturesEnabled: true,
onMapCreated: (GoogleMapController controller) {
widget._controller.complete(controller);
},
);
}
}
class MainHomeViewStateUi extends MainHomeViewState
with TickerProviderStateMixin {
int zoomLevel = 0;
int pixelRatio = 1;
@override
AppBar buildAppBar() {
return null;
}
Completer<GoogleMapController> _controller = Completer();
ScrollController scrollController;
@override
void initState() {
super.initState();
loadPosition();
}
static final CameraPosition _kGooglePlex = CameraPosition(
target: LatLng(59.4376129, 24.7396893),
zoom: 14.4746,
);
Widget buildBody(BuildContext context) {
return Scaffold(
body: SafeArea(
child: Container(
child: CustomScrollView(
slivers: <Widget>[
SliverAppBar(
expandedHeight: MediaQuery
.of(context)
.size
.height - 350.0,
floating: false,
pinned: false,
flexibleSpace: Container(
child: ClipRect(
child: Stack(
children: <Widget>[
AnimatedGoogleMaps(
kGooglePlex: _kGooglePlex,
controller: _controller),
Positioned(
top: 15,
left: 15,
child: Container(
width: MediaQuery
.of(context)
.size
.width - 30,
child: SearchBar(),
)),
],
),
),
),
),
SliverList(
delegate: SliverChildListDelegate(
[
Container(
height: 280,
child: CarouselWithIndicator(),
),
AdItemsList(items: imgList),
],
),
),
],
),
),
));
}
}