繁体   English   中英

MultiProvider 执行 function Flutter

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM