Flutter 颤振-如何更改子窗口小部件语言

Flutter 颤振-如何更改子窗口小部件语言,flutter,dart,locale,Flutter,Dart,Locale,我想在不重新加载应用程序的情况下更改所有应用程序语言。我曾经 我在appBar和AppHomeScreen的正文中有一个切换语言按钮,下面是MyHomePage类中的build函数: addClickFn(model) { FocusScope.of(context).requestFocus(FocusNode()); Navigator.push<dynamic>( context, MaterialPageRoute<dynam

我想在不重新加载应用程序的情况下更改所有应用程序语言。我曾经

我在
appBar
AppHomeScreen
的正文中有一个切换语言按钮,下面是
MyHomePage
类中的
build
函数:

  addClickFn(model) {
    FocusScope.of(context).requestFocus(FocusNode());
    Navigator.push<dynamic>(
      context,
      MaterialPageRoute<dynamic>(
          builder: (BuildContext context) => MyPopupScreen(callback: (c, id) => { }),
          fullscreenDialog: true),
    );
  }

  @override
  Widget build(BuildContext context) {
    return ScopedModelDescendant<ResponseDataModel>(
        builder: (context, _, model) => Scaffold(
              backgroundColor: AppTheme.white,
              body: FutureBuilder<bool>(
                future: getData(),
                builder: (BuildContext context, AsyncSnapshot<bool> snapshot) {
                  if (!snapshot.hasData) {
                    return const SizedBox();
                  } else {
                    return Padding(
                      padding: EdgeInsets.only(
                          top: MediaQuery.of(context).padding.top),
                      child: Column(
                        mainAxisAlignment: MainAxisAlignment.center,
                        crossAxisAlignment: CrossAxisAlignment.start,
                        children: <Widget>[
                          appBar(),
                          Expanded(
                            child: FutureBuilder<bool>(
                              future: getData(),
                              builder: (BuildContext context,
                                  AsyncSnapshot<bool> snapshot) {
                                if (!snapshot.hasData) {
                                  return const SizedBox();
                                } else {
                                  return AppHomeScreen(
                                      addClickFn: () => addClickFn(model));
                                }
                              },
                            ),
                          ),
                        ],
                      ),
                    );
                  }
                },
              ),
            ));
  }
AppHomePage
中,我将
BottomBarView
仪表板屏幕
一起作为选项卡主体

  @override
  Widget build(BuildContext context) {
    return Container(
      color: AppTheme.background,
      child: Scaffold(
        backgroundColor: Colors.transparent,
        body: FutureBuilder<bool>(
          future: getData(),
          builder: (BuildContext context, AsyncSnapshot<bool> snapshot) {
            if (!snapshot.hasData) {
              return const SizedBox();
            } else {
              return Stack(
                children: <Widget>[
                  tabBody,
                  bottomBar(),
                ],
              );
            }
          },
        ),
      ),
    );
  }

  Future<bool> getData() async {
    await Future<dynamic>.delayed(const Duration(milliseconds: 200));
    return true;
  }

  Widget bottomBar() {
    return Column(
      children: <Widget>[
        const Expanded(
          child: SizedBox(),
        ),
        BottomBarView(
          tabIconsList: tabIconsList,
          addClick: () {
            if (widget.addClickFn != null) widget.addClickFn();
          },
          changeIndex: (int index) {
            if (index == 0) {
              animationController.reverse().then<dynamic>((data) {
                if (!mounted) {
                  return;
                }
                setState(() {
                  tabBody =
                      DashboardScreen(animationController: animationController);
                });
              });
            }
          },
        ),
      ],
    );
  }
当我单击“切换语言”按钮时,当前上下文中的所有文本(标题)都翻译得很好,但
仪表板屏幕中的所有文本(label.welcome)都翻译得不好

当我单击底部栏上的添加按钮重定向到
MyPopupScreen
然后关闭此弹出窗口时,
仪表板屏幕
中的文本已被翻译

单击
MyHomePage
上的“切换语言”按钮时,如何更改
仪表板屏幕中的所有文本

对不起,我的英语不好

使用旧的
currentLang
值调用
flatteri18n.refresh

试试这个:

                    setState(() {
                      currentLang = currentLang.languageCode == 'vn'
                          ? new Locale('gb')
                          : new Locale('vn');

                      FlutterI18n.refresh(context, currentLang);
                    });

你在哪里加载和更新本地化值?我像这个例子一样进行设置。并通过flatteri18n.refresh()更新语言
  @override
  Widget build(BuildContext context) {
    return Container(
      color: AppTheme.background,
      child: Scaffold(
        backgroundColor: Colors.transparent,
        body: Stack(
          children: <Widget>[
            getMainListViewUI(),
            // getAppBarUI(),
            SizedBox(
              height: MediaQuery.of(context).padding.bottom,
            )
          ],
        ),
      ),
    );
  }

  Widget getMainListViewUI() {
    return ListView(
      scrollDirection: Axis.vertical,
      semanticChildCount: 10,
      children: <Widget>[
        Container(
            padding:
                EdgeInsets.only(top: 0.0, left: 24, right: 24, bottom: 24.0),
            child: Text(FlutterI18n.translate(context, "label.welcome"),
                textAlign: TextAlign.left,
                style: TextStyle(
                  fontFamily: AppTheme.fontName,
                  fontWeight: FontWeight.w700,
                  fontSize: 30 + 6 - 6 * topBarOpacity,
                  letterSpacing: 1.2,
                  color: AppTheme.darkerText,
                ))),
      ],
    );
  }
                    setState(() {
                      currentLang = currentLang.languageCode == 'vn'
                          ? new Locale('gb')
                          : new Locale('vn');

                      FlutterI18n.refresh(context, currentLang);
                    });