首页 > 解决方案 > 颤振重建对话框元素与提供者

问题描述

我正在使用提供程序,并且我想重建对话框中包含的消息。对话似乎是个问题。

当我冲刺这些值时,我观察到它们已被修改,但这并未在对话框中应用

在构建方法下的屏幕页面中,我有这个:

var _loaderProvider = Provider.of<LoaderNotifier>(context, listen:false);

在我的屏幕页面中调用对话框的按钮:

onPressed: () async {
  await _formProvider.submitForm(context);
  print(_formProvider.state);
  print(_loaderProvider.state);
  if(_formProvider.state == FormProviderState.isSuccess){

    void myShowDialog() async{
      await showDialog(
        context: context,
        builder: (_) {
          return ChangeNotifierProvider.value(
              value: _loaderProvider,
              child: DialogComponent.loadingPopUp(description: _loaderProvider.message));
        },
      );
    }

    myShowDialog();


    // Here I change the state of the dialog
    _loaderProvider.state = LoaderState.isLoadingJsons;
    print(_loaderProvider.state);
    await TimerService.wait(2);

    // Here I change the message dialog
    await _loaderProvider.updateMessage();

    print(_loaderProvider.state);
    print(_loaderProvider.message);

  }
},

在打印中,我看到所有变量都在 2 秒后更新,但我没有在对话框中看到修改。

定时器服务:

class TimerService{

  static Future wait(int seconds) async {
    return Future.delayed(Duration(seconds: seconds));
  }

}

loaderNotifier:

class LoaderNotifier with ChangeNotifier {

  LoaderState state = LoaderState.isReady;
  String _message = "Start...";

  String get message => _message;

  Future updateMessage() async {
    print('update message');
    if(state == LoaderState.isLoadingJsons){
        _message = "Loading files...";
    }
    else if(state == LoaderState.isLoadingElements){
      _message = "Loading...";
    }
    notifyListeners();
  }

}

编辑:我发现,我改变了我的 showDialog 功能:

void myShowDialog(){
   final myModel = Provider.of<LoaderNotifier>(context, listen: false);
   showDialog(
     context: context,
     barrierDismissible: false,
     builder: (_) {
       return ChangeNotifierProvider.value(
           value: myModel,
           child: Consumer<LoaderNotifier>(
            builder: (context, model, child) => DialogComponent.loadingPopUp(description: model.message)
           )
       );
     },
   );
  }

标签: flutterdart

解决方案


推荐阅读