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

时间:2020-10-12 14:11:31

标签: flutter provider consumer changenotifier

这是从源代码逐步复制的代码(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')),
    );
  }}

2 个答案:

答案 0 :(得分:0)

主类是

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(),
          ],
        ),
      ),
    );
  }
}

答案 1 :(得分:0)

要强制 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')
        ),
      ),
    );
  }
}