我必须在 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();
}
}
答案 0 :(得分:2)
问题是您试图访问使用相同的build
方法创建的信息。
在“使用”提供程序之前,您需要构建一个小部件以确保创建了提供程序。
如果您不想创建新的StateLess / StateFull小部件,请添加一个Builder,如下所示:
...body: Builder(
builder:(BuildContext context)=> Consumer<FontSizeHandler>(...))
通过这种方式,Builder将确保您的父级提供程序在使用之前就已构建。
编辑:
如果您希望提供程序在同一个有状态/无状态小组件中可使用,则上面的答案就可以了。
如果需要从Flutter应用程序中的任何位置访问提供程序,请确保在MaterialApp / CupertinoApp之前创建提供程序。
答案 1 :(得分:0)
遇到了类似的问题。通过从文件树而不是应用程序包中导入提供程序来解决。
我是这样做的:
import '../fav_provider.dart';
而不是这个。
import 'package:gmartapp/fav_provider.dart';
只需确保您的提供程序是从您的应用程序包而不是您的文件树中导入的。