首页 > 解决方案 > 调用 showSlideDialog 时上下文和提供程序出错

问题描述

首先,我创建了这些单选按钮,它们运行良好

 Widget buildRadioLanguageListTile(
          Languages langvalue, String txt, BuildContext ctx2) {
        return RadioListTile(
            value: langvalue,
            groupValue:
                Provider.of<LanguageProvider>(ctx2, listen: true).currentLang,
            onChanged: (langvalue) =>
                Provider.of<LanguageProvider>(ctx2, listen: false)
                    .changeLanguage(langvalue),
            title: Text(
              txt,
              style: Theme.of(ctx2).textTheme.bodyText1,
            ));
      }


      ListView(
            Column(
         mainAxisSize: MainAxisSize.min, children: <Widget>[
          buildRadioLanguageListTile(
              Languages.English, txt.getTexts("english"), context),
          buildRadioLanguageListTile(
              Languages.Arabic, txt.getTexts("arabic"), context),
          buildRadioLanguageListTile(
              Languages.Turkish, txt.getTexts("turkish"), context),
        ]);

        

到目前为止,一切都运行良好,但我想将这些按钮放在 showSlideDialog 中,如下所示:

import 'package:slide_popup_dialog/slide_popup_dialog.dart' as slideDialog;


void _showDialog() {   // here the problem begin
slideDialog.showSlideDialog(
  context: context,
  child: Column(
    children: [
        buildRadioLanguageListTile(
              Languages.English, lan.getTexts("english"), context),
          buildRadioLanguageListTile(
              Languages.Arabic, lan.getTexts("arabic"), context),
          buildRadioLanguageListTile(
              Languages.Turkish, lan.getTexts("turkish"), context),
    ],
  ),
);}



.
.
.

                      InkWell(
                      child: Container(
                        child: Text("language"),
                      ),
                      onTap:  _showDialog,  // calling _showDialog
                    )

现在我收到此错误:

Tried to listen to a value exposed with provider, from outside of the widget tree.

This is likely caused by an event handler (like a button's onPressed) that called
Provider.of without passing `listen: false`.

To fix, write:
Provider.of<LanguageProvider>(context, listen: false);

It is unsupported because may pointlessly rebuild the widget associated to the
event handler, when the widget tree doesn't care about the value.

The context used was: GeneralSetting(dependencies: [_InheritedProviderScope<LanguageProvider>, _LocalizationsScope-[GlobalKey#41a3d], _InheritedProviderScope<ThemeProvider>, _InheritedTheme])

我认为在处理提供者或上下文时存在错误。我该如何解决这个问题?

标签: flutter

解决方案


问题在于我的代码部分的上下文。surly 有很多错误,但我通过使用具有上下文和构建器的 showModalBottomSheet 解决了这个问题。

  showModalBottomSheet(
      context: context,
      builder: (context) {
        return Column(mainAxisSize: MainAxisSize.min, children: <Widget>[
          buildRadioLanguageListTile(
              Languages.English, txt.getTexts("english"), context),
          buildRadioLanguageListTile(
              Languages.Arabic, txt.getTexts("arabic"), context),
          buildRadioLanguageListTile(
              Languages.Turkish, txt.getTexts("turkish"), context),
        ]);
      });

其余代码相同。


推荐阅读