首页 > 解决方案 > 错误:找不到正确的提供者在此 LoginScreen 小部件上方

问题描述

这个屏幕是一个登录屏幕,它使用户进入应用程序。尽管我使用了正确的提供程序,但我收到了这个错误

{错误:在此 Z 小部件上方找不到正确的提供程序

要修复,请:

  • 确保 Provider 是这个 Z Widget 的祖先
  • 向 Provider 提供类型
  • 向消费者提供类型
  • 向 Provider.of() 提供类型
  • 始终使用包导入。前任:import 'package:my_app/my_code.dart';
  • 确保使用正确context

我想知道为什么使用Provider.of(context)不起作用的问题

    import 'package:provider/provider.dart';
    import 'package:voyager/api/userProvider.dart';

    class LoginScreen extends StatefulWidget {

    @override
    _LoginScreenState createState() => _LoginScreenState();
    }

    class _LoginScreenState extends State<LoginScreen> {
    UserProvider user_Provider;



     @override
       Widget build(BuildContext context) {
        userProvider = Provider.of<UserProvider>(context,listen: false);
        return MultiProvider(
          providers: [
            ChangeNotifierProvider(create: (_) => UserProvider()),
          ],
        child: Consumer<UserProvider>(
          builder: (context, userProvider, child) =>  Container(
            child: Scaffold(
                body: InkWell(
                  splashColor: Colors.transparent,
                  highlightColor: Colors.transparent,
                  focusColor: Colors.transparent,
                  onTap: () {

闪屏代码

 Widget build(BuildContext context) {
    return Container(
      child: Scaffold(
        backgroundColor: AppTheme.getTheme().backgroundColor,
        body:Column(
          children: <Widget>[
            SizedBox(
              height: MediaQuery.of(context).padding.top,
            ),
            Expanded(
              child: PageView(
                controller: pageController,
                pageSnapping: true,
                onPageChanged: (index) {
                  currentShowIndex = index;
                },
                scrollDirection: Axis.horizontal,
                children: <Widget>[
                  PagePopup(imageData: pageViewModelData[0]),
                  PagePopup(imageData: pageViewModelData[1]),
                  PagePopup(imageData: pageViewModelData[2]),
                ],
              ),
            ),
            PageIndicator(
              layout: PageIndicatorLayout.WARM,
              size: 10.0,
              controller: pageController,
              space: 5.0,
              count: 3,
              color: AppTheme.getTheme().dividerColor,
              activeColor: AppTheme.getTheme().primaryColor,
            ),
            Padding(
              padding: const EdgeInsets.only(left: 48, right: 48, bottom: 8, top: 32),
              child: Container(
                height: 48,
                decoration: BoxDecoration(
                  color: AppTheme.getTheme().primaryColor,
                  borderRadius: BorderRadius.all(Radius.circular(24.0)),
                  boxShadow: <BoxShadow>[
                    BoxShadow(
                      color: AppTheme.getTheme().dividerColor,
                      blurRadius: 8,
                      offset: Offset(4, 4),
                    ),
                  ],
                ),
                child: Material(
                  color: Colors.transparent,
                  child: InkWell(
                    borderRadius: BorderRadius.all(Radius.circular(24.0)),
                    highlightColor: Colors.transparent,
                    onTap: () {
                      Navigator.push(
                        context,
                        MaterialPageRoute(builder: (context) => LoginScreen()),
                      );
                    },

标签: flutter

解决方案


您可以在祖先小部件中注册提供程序,MyApp
并让您的提供程序包装MaterialApp(home: LoginScreen())

代码片段

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider(create: (_) => X()),
      ],
      child: Consumer<X>(
        builder: (context, counter, _) {
          return MaterialApp(
            home: LoginScreen(),
          );
        },
      ),
    );
  }
}

完整的测试代码

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

void main() => runApp(MyApp());

class X with ChangeNotifier {
  int _count = 0;
  int get count => _count;

  void increment() {
    _count++;
    notifyListeners();
  }
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider(create: (_) => X()),
      ],
      child: Consumer<X>(
        builder: (context, counter, _) {
          return MaterialApp(
            home: LoginScreen(),
          );
        },
      ),
    );
  }
}


class LoginScreen extends StatelessWidget {
  const LoginScreen({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    final user_Provider = Provider.of<X>(context);
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '${user_Provider.count}',
              style: Theme.of(context).textTheme.display1,
            ),
          ],
        ),
      ),
      floatingActionButton: IncrementCounterButton(),
    );
  }
}


class IncrementCounterButton extends StatelessWidget {
  const IncrementCounterButton({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return FloatingActionButton(
      onPressed: () {
        Provider.of<X>(context, listen: false).increment();
      },
      tooltip: 'Increment',
      child: const Icon(Icons.add),
    );
  }
}

推荐阅读