[英]MultiProvider executing function Flutter
我在GestrureDetector小部件中有文本,我想通过单击文本“imie”来执行我的 function showNameAction 。
错误:
“在此 FriendsPageEditable 小部件上方找不到正确的提供者”
FriendsEditablePage.dart:(短版) (无状态类)
return MultiProvider(
providers: [
ChangeNotifierProvider.value(value: SaveBoxes()),
],
child: Scaffold(
body: GestureDetector(
onTap: () {
Provider.of<SaveBoxes>(context, listen: false).showNameAction;
},
child: Text(imie))),
SaveBoxes.dart
class SaveBoxes extends ChangeNotifier {
void showNameAction(BuildContext context) {
showDialog<void>(
context: context,
builder: (context) {
return AlertDialog();
},
);
}
}
这行代码对我来说看起来不对:
ChangeNotifierProvider.value(value: SaveBoxes()),
您正在使用ChangeNotifierProvider.value
小部件,当您已经有一个实例并且不想创建一个新实例时使用该小部件。 但在value: SaveBoxes()
您创建了一个实例。 所以尝试将其更改为:
ChangeNotifierProvider(create: (context) => SaveBoxes()),
您可以在 main.dart 中使用Multiprovider
并在friendseditablepage.dart中调用SaveBoxes saveBoxes = Provider.of<SaveBoxes>(context)
)
这是基于您的案例的源代码。 希望它有效:
main.dart文件:
void main() async {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
ChangeNotifierProvider(
create: (context) => SaveBoxes(),
),
],
child: const MaterialApp(
home: FriendsEditablePage(),
),
);
}
}
Friendseditablepage.dart文件:
class FriendsEditablePage extends StatelessWidget {
const FriendsEditablePage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
SaveBoxes saveBoxes = Provider.of<SaveBoxes>(context);
return Scaffold(
body: SafeArea(
child: GestureDetector(
onTap: () {
saveBoxes.showNameAction(context);
},
child: const Text('imie'),
),
),
);
}
}
saveboxes.dart文件:
class SaveBoxes extends ChangeNotifier {
void showNameAction(BuildContext context) {
showDialog<void>(
context: context,
builder: (context) {
return AlertDialog(
title: const Text('AlertDialog Title'),
content: SingleChildScrollView(
child: ListBody(
children: const <Widget>[
Text('This is a demo alert dialog.'),
Text('Would you like to approve of this message?'),
],
),
),
actions: <Widget>[
TextButton(
child: const Text('Approve'),
onPressed: () {
Navigator.of(context).pop();
},
),
],
);
},
);
}
}
尝试将您的GestureDetector
包装在Builder
中,以便您可以访问更新的上下文。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.