颤振如何正确使用Consumer和ChangeNotifierProvider?找不到丢失的东西

问题描述

这是从源代码逐步复制的代码(Fidev设计挑战),但出现了错误 怀疑类是MainPage和LeopardPage 已经导入了所有必要的软件包 无法找出缺少的东西

class LeopardPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {

    //print(MediaQuery.of(context).size.width);
    return Consumer<PageOffsetNotifier>(

        builder:(context,value,child)
    {
      return Positioned(
        top: 100,left: -0.85 * value.offset,width: MediaQuery.of(context.watch()).size.width*1.6,child: child,);
    },child: IgnorePointer(child: Image.asset('assets/leopard.png')),);
  }}

解决方法

主类是

class _MainPageState extends State<MainPage> {
  final PageController _pageController = PageController();

  @override
  Widget build(BuildContext context) {

    return ChangeNotifierProvider(

      create: (_) {return PageOffsetNotifier(_pageController); },child: Scaffold(
        body: Stack(
          children: <Widget>[

            PageView(
              controller: _pageController,physics: ClampingScrollPhysics(),children: <Widget>[
                //LeopardPage(),VultturePage(),],),LeopardPage(),);
  }
}
,

要强制 Consumer 使用 ChangeNotifier,您应该提供它之前,即

class LeopardPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
      create: (_) => PageOffsetNotifier(),// lazy creation of model
      child: Consumer<PageOffsetNotifier>(
        builder:(context,value,child) {
          return Positioned(
            top: 100,left: -0.85 * value.offset,width: MediaQuery.of(context.watch()).size.width*1.6,child: child,);
        },child: IgnorePointer(
          child: Image.asset('assets/leopard.png')
        ),);
  }
}