Flutter更新Appbar中的文本

2024-05-04

我需要帮助更新应用栏中的文本以匹配我当前所在的页面。

因此,如果我在“设置”页面中,那么我需要在 AppBar 文本中显示它。

我添加代码和屏幕截图是为了更好地解释我想要实现的目标。

主dart

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // This will change the statusbar text color.
    FlutterStatusbarcolor.setStatusBarWhiteForeground(false);

    return ChangeNotifierProvider<ThemeChanger>(
      create: (_) => ThemeChanger(CustomThemes.lightTheme.copyWith(
          textTheme:
              CustomThemes.textTheme(CustomThemes.lightTheme.textTheme))),
      child: MaterialAppWithTheme(),
    );
  }
}

class MaterialAppWithTheme extends StatefulWidget {
  @override
  _MaterialAppWithTheme createState() => _MaterialAppWithTheme();
}

class _MaterialAppWithTheme extends State<MaterialAppWithTheme> {

  var appTitle = 'Material Design';

  @override
  Widget build(BuildContext context) {
    final theme = Provider.of<ThemeChanger>(context);

    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: appTitle,
      theme: theme.getTheme(),
      home: Scaffold(
        appBar: AppBar(
          title: Text(
            appTitle,
            style: TextStyle(color: CustomColors().novaWhite),
          ),
        ),
        body: BlocProvider<MdNavBloc>(
          create: (context) => MdNavBloc(),
          child: Stack(
            children: <Widget>[
              BlocBuilder<MdNavBloc, NavigationStates>(
                builder: (context, state) {
                  if (state is DashboardState) {
                    return DashBoardPage();
                  } else if (state is ExpensesState) {
                    return ExpensesPage();
                  } else if (state is NotificationsState) {
                    return NotificationsPage();
                  } else if (state is ErrorsState) {
                    return ErrorsPage();
                  } else if (state is SettingsState) {
                    return SettingsPage();
                  } else {
                    return DashBoardPage();
                  }
                },
              ),
              MdDrawer(title: appTitle, updateAppBarTitle: _updateAppBarTitle,),
            ],
          ),
        ),
      ),
    );
  }

  void _updateAppBarTitle(String newTitle) {
    setState(() {
      appTitle = newTitle;
    });
  }
}

MdDrawer.dart

class MdDrawer extends StatefulWidget {
  final String title;
  final Function(String) updateAppBarTitle;

  MdDrawer({Key key, this.title, @required this.updateAppBarTitle}) : super(key: key);

  @override
  MdDrawerState createState() {
    return new MdDrawerState();
  }
}

class MdDrawerState extends State<MdDrawer>
    with SingleTickerProviderStateMixin {
  bool isCollapsed = true;
  AnimationController _animationController;
  Animation<double> widthAnimation;
  int currentSelectedIndex = 0;

  @override
  void initState() {
    super.initState();
    _animationController = AnimationController(
      vsync: this,
      duration: Duration(milliseconds: 300),
    );
    widthAnimation = Tween<double>(
      begin: Constants.minWidth,
      end: Constants.maxWidth,
    ).animate(_animationController);
  }

  @override
  Widget build(BuildContext context) {
    final MdNavBloc bloc = BlocProvider.of<MdNavBloc>(context);

    return AnimatedBuilder(
      animation: _animationController,
      builder: (context, widget) => getWidget(bloc, context, widget),
    );
  }

  Widget getWidget(MdNavBloc bloc, context, widget) {
    return Material(
      //elevation: 80.0,
      child: Container(
        width: widthAnimation.value,
        //color: drawerBackgroundColor,
        color: Theme.of(context).backgroundColor,
        child: Column(
          children: <Widget>[
            Container(
              margin: EdgeInsets.symmetric(
                vertical: Constants.containerMargin,
              ),
              child: MdListTile(
                title: 'Jaser Jsk',
                icon: Icons.person,
                animationController: _animationController,
              ),
            ),

            Divider(color: Colors.grey, height: 20.0),

            SizedBox(
              height: 8.0,
            ),
            Expanded(
              child: ListView.separated(
                separatorBuilder: (context, counter) {
                  return Divider(height: 12.0);
                },
                itemBuilder: (context, counter) {
                  return MdListTile(
                    onTap: () {

                      widget.updateAppBarTitle(navigationItems[counter].title);

                      setState(() {
                        bloc.add(navigationItems[counter].navigationEvent);
                        currentSelectedIndex = counter;

                        isCollapsed = !isCollapsed;
                        _animationController.reverse();
                      });
                    },
                    isSelected: currentSelectedIndex == counter,
                    title: navigationItems[counter].title,
                    icon: navigationItems[counter].icon,
                    animationController: _animationController,
                  );
                },
                itemCount: navigationItems.length,
              ),
            ),
            InkWell(
              onTap: () {
                setState(() {
                  isCollapsed = !isCollapsed;
                  isCollapsed
                      ? _animationController.reverse()
                      : _animationController.forward();
                });
              },
              child: AnimatedIcon(
                icon: AnimatedIcons.menu_close,
                progress: _animationController,
                color: Theme.of(context).accentColor,
                size: 40.0,
              ),
            ),
            SizedBox(
              height: 20.0,
            ),
          ],
        ),
      ),
    );
  }
}

您可以更新中的文本AppBar小部件在MaterialAppWithTheme通过有一个方法来更新文本MaterialAppWithTheme并将其作为回调传递给MdDrawerState并在您更改抽屉项目时执行该操作。

所以在你的MaterialAppWithTheme小部件(您现在必须制作一个有状态小部件),您定义了以下方法:

void _updateAppBarTitle(String newTitle) {
    setState((){
        appTitle = newTitle;
    });
}

那么你必须修改MdDrawer像下面这样接受一个 Function 对象作为参数:

class MdDrawer extends StatefulWidget {
  final String title;
  final Function(String) updateAppBarTitle;

  MdDrawer({Key key, this.title, @required this.updateAppBarTitle}) : super(key: key);

  @override
  MdDrawerState createState() {
    return new MdDrawerState();
  }
}

而在你的MdListTile's onTap,你可以这样称呼它:

   return MdListTile(
                onTap: () {
                  widget.updateAppBarTitle(navigationItems[counter].title);
                  //Other methods
                },
                isSelected: currentSelectedIndex == counter,
                title: navigationItems[counter].title,
                icon: navigationItems[counter].icon,
                animationController: _animationController,
              );
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flutter更新Appbar中的文本 的相关文章

  • CollapsingToolBarLayout - 状态栏稀松布颜色不改变

    几天前我更新了我的 android studio 并开始使用 CoordinatorLayout 和 CollapsingToolbarLayout 只是尝试一些东西 工具栏稀松布颜色似乎覆盖了状态栏初始颜色和状态栏稀松布颜色 从 xml
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • 尝试将相机切换回前面但出现异常

    尝试将相机切换回前面 但出现异常 找不到 问题请检查并帮助 error 01 27 11 49 00 376 E AndroidRuntime 30767 java lang RuntimeException Unable to start
  • 是否有 ADB 命令来检查媒体是否正在播放

    我想使用 ADB 命令检查根植于终端的外部设备中是否正在播放音频 视频 我无法找到任何 ADB 命令 如果有 我尝试过 adb shell dumpsys media player 我想要一个命令来指定视频是否正在运行 您可以使用以下命令查
  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我
  • 在 SQLite 中搜索时排除 HTML 标签和一些 UNICODE 字符

    更新 4 我已经成功运行了firstchar例如 但现在的问题是使用regex 即使包含头文件 它也无法识别regex操作员 有什么线索可以解决这个问题吗 更新 2 我已经编译了sqlite3我的项目中的库 我现在正在寻找任何人帮助我为我的
  • 将 iPad xib 转换为 iPhone xib

    我看过很多关于将 iPhone xib 转换为 iPad xib 的帖子和教程 但我想反过来做 我能找到的唯一资源是 将 iPad 应用程序转换为 iPhone https stackoverflow com questions 68550
  • 如何发布Android .aar源以使Android Studio自动找到它们?

    我正在将库发布到内部 Sonatype Nexus 存储库 Android Studio 有一个功能 可以自动查找通过 gradle 引用的库的正确源 我将 aar 的源代码作为单独的 jar 发布到 Nexus 但 Android Stu
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • iPhone 上的语音识别

    我需要开发一个识别语音的 iPhone 应用程序 并根据结果执行进一步的任务 我知道iPhone 3 0不支持语音识别 我需要在服务器端实现语音识别软件 我只知道这个事情 因为我是新手 所以我不知道如何处理 意味着我需要购买哪些软件并在服务
  • Android向menuItem添加子菜单,addSubMenu()在哪里?

    我想根据我的参数以编程方式将 OptionsMenu 内的子菜单添加到 menuItem 中 我检查了android sdk中的 MenuItem 没有addSubMenu 方法 尽管你可以找到 hasSubMenu 和 getSubMen
  • Glib 在 iPhone 应用程序中的使用

    我想基于现有的开源 Objective C 框架开发一个 iPhone 应用程序 但是该框架广泛使用了 glib 库 我找不到一种方法来构建和包含 iPhone 应用程序的 glib 库 非越狱 有什么办法可以做到这一点 或者有没有推荐的方
  • .isProviderEnabled(LocationManager.NETWORK_PROVIDER) 在 Android 中始终为 true

    我不知道为什么 但我的变量isNetowrkEnabled总是返回 true 我的设备上是否启用互联网并不重要 这是我的GPSTracker class public class GPSTracker extends Service imp
  • AppLifeCycleState.detached 未被调用

    import package flutter material dart void main gt runApp MyApp class MyApp extends StatelessWidget override Widget build
  • 在activity_main.xml中注释

    我是安卓新手 据我所知 XML 中的注释与 HTML 中的注释相同 使用 形式 我想在 Android 项目的 Activity main xml 配置文件中写一些注释 但它给了我错误 值得注意的是 我使用的是 Eclipse 但目前 我直
  • Android:膨胀布局时出现 StackOverFlowError 和 InvokingTargetException

    首先 对不起我的英语 我在膨胀布局时有一个问题 我有一个自定义视图 从 LinearLayout 扩展而来 称为按钮帮助 我在名为的布局上使用该视图加载活动 我的以下代码在所有设备和模拟器上都能完美运行 但具有 QVGA 屏幕 例如 Sam
  • 一次显示两条Toast消息?

    我希望在一个位置显示一条 Toast 消息 并在另一位置同时显示另一条 Toast 消息 多个 Toast 消息似乎总是按顺序排队和显示 是否可以同时显示两条消息 是否有一种解决方法至少可以提供这种外观并且不涉及扰乱活动布局 Edit 看来
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分

随机推荐