MultiProvider 执行函数 Flutter

MultiProvider executing function Flutter

我在 GestrureDetector 小部件中有 Text,我想执行我的函数 showNameAction点击文本“imie”。

错误:

"在此 FriendsPageEditable 小部件上方找不到正确的提供者"

FriendsEditablePage.dart : (短版) (无状态class)

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

尝试将您的 GestureDetector 包裹在 Builder 中,以便您可以访问更新后的上下文。

我觉得这行代码不对:

ChangeNotifierProvider.value(value: SaveBoxes()),

您正在使用 ChangeNotifierProvider.value 小部件,当您已经有一个实例并且不想创建一个新实例时使用该小部件。但是在 value: SaveBoxes() 中你创建了一个实例。所以尝试将其更改为:

ChangeNotifierProvider(create: (context) => SaveBoxes()),

您可以在main.dart中使用Multiprovider并在friendseditablepage.dart[=30中调用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();
              },
            ),
          ],
        );
      },
    );
  }
}