【问题标题】:Could not find the correct Provider<FontSizeHandler> above this HomePage Widget在此主页小部件上方找不到正确的 Provider<FontSizeHandler>
【发布时间】:2020-06-25 05:05:53
【问题描述】:

我必须在 AppBar 中的 IconButton 并且在新闻上我想使用 Providers 包更改字体大小。 但我不断收到此错误消息:

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

这可能是因为您使用了BuildContext 包括您选择的提供商。有几种常见的情况:

  • 您尝试读取的提供程序位于不同的路径中。

    提供者是“范围的”。因此,如果您在路线内插入提供者, 那么其他路由将无法访问该提供程序。

HomePage.dart

class _HomePageState extends State<HomePage> {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<FontSizeHandler>(
      create: (BuildContext context) => FontSizeHandler(),
      child: Scaffold(
        appBar: AppBar(
          actions: <Widget>[
           
            IconButton(
              icon: Icon(Icons.arrow_upward),
              onPressed: () {
                Provider.of<FontSizeHandler>(context, listen: false)
                    .increaseFont();
              },
            ),
          ],
        ),
        body: Consumer<FontSizeHandler>(builder: (context, myFontHandler, _) {
          return Container(
            child: AutoSizeText(
              kDummy,
              style: TextStyle(fontSize: myFontHanlder.fontSize),
            ),
          );
        }),
      ),
    );
  }
}

FontChangeHandler.dart

    class FontSizeHandler extends ChangeNotifier {
      double fontSize = 15;
      void increaseFont() {
        fontSize = fontSize + 2;
        notifyListeners();
      }

  void decreaseFont() {
    fontSize = fontSize - 2;
    notifyListeners();
  }
}

【问题讨论】:

    标签: flutter flutter-provider


    【解决方案1】:

    问题是您正试图访问您在同一 build 方法上创建的信息。

    在您“使用”提供程序之前,您需要构建一个小部件以确保您的提供程序的创建发生。

    如果您不想创建新的 StateLess/StateFull Widget,请添加 Builder,如下所示:

    ...body: Builder(
         builder:(BuildContext context)=> Consumer<FontSizeHandler>(...))
    
    

    这样,Builder 将确保您的父提供程序在使用之前得到构建。

    编辑:

    如果您希望 Provider 在同一个 Stateful/Stateless Widget 中成为 Consumable,那么上面的答案就可以了。

    如果您需要从 Flutter App 中的任何位置访问 Provider,请确保在 MaterialApp/CupertinoApp 之前创建 Provider。

    【讨论】:

    • 你试过把ChangeNotifierProvider&lt;FontSizeHandler&gt;放在你的MaterialApp之前吗?这样它应该可以在您的整个应用程序上使用。在不了解您的应用结构的情况下很难回答这个问题。
    • 我在文档中提到的 runApp() 方法中使用了 MultiProvider 并且它有效。还是谢谢你
    【解决方案2】:

    有类似的问题。通过从文件树而不是应用程序包导入提供程序来解决。

    我正在这样做:

    import '../fav_provider.dart';
    
    

    而不是这个。

    import 'package:gmartapp/fav_provider.dart';
    
    

    只需确保您的提供程序是从您的应用程序包而不是您的文件树中导入的。

    【讨论】:

    • 两种方式导入都是一样的,可能你只是没有点击保存生效(热重载),OP问题主要是关于同时创建和消费提供者(在一个地方),但是感谢您的关注。
    猜你喜欢
    • 1970-01-01
    • 2021-10-22
    • 2021-11-24
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 2021-10-27
    • 2021-01-27
    相关资源
    最近更新 更多