You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter导航跳转Home至SearchStore失败,报Material缺失错误

解决方案:解决Flutter导航跳转时"No Material widget found"错误

问题原因

Hero动画过渡期间,TextField会被临时挂载到Overlay组件中,此时它无法获取到原有的Material上下文(即使页面本身在Scaffold内),导致Material组件依赖检查失败。

修复步骤

在两个页面的Hero组件内部,给TextField包裹一层Material组件,并设置type: MaterialType.transparency以保持原有样式不受影响:

修改后的Home组件代码

class Home extends StatelessWidget {
  const Home ({super.key});

  @override
  Widget build(BuildContext context) {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        Text(
          'search store',
          style: AppStyle().appTheme.textTheme.displayLarge,
        ),
        SizedBox(
          height: 20,
        ),
        Hero(
          tag: 'hero',
          // 添加Material包裹
          child: Material(
            type: MaterialType.transparency,
            child: TextField(
              readOnly: true,
              onTap: () {
                Navigator.of(context).push(
                  MaterialPageRoute(
                    builder: (context) => SearchStore(),
                  ),
                );
              },
              decoration: InputDecoration(
                prefixIcon: Icon(Icons.search),
                prefixIconColor: AppStyle().brandColor,
                hintText: 'need store name',
                enabledBorder: OutlineInputBorder(
                  borderSide: BorderSide(
                    color: AppStyle().brandColor,
                    width: 1.5,
                  ),
                  borderRadius: BorderRadius.circular(15),
                ),
                focusedBorder: OutlineInputBorder(
                  borderSide: BorderSide(
                    color: AppStyle().brandColor,
                    width: 1.5,
                  ),
                  borderRadius: BorderRadius.circular(15),
                ),
              ),
            ),
          ),
        )
      ],
    );
  }
}

修改后的SearchStore组件代码

class SearchStore extends StatelessWidget {
  const SearchStore({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: [
          Hero(
            tag: 'hero',
            // 添加Material包裹
            child: Material(
              type: MaterialType.transparency,
              child: TextField(
                readOnly: false,
                decoration: InputDecoration(
                  prefixIcon: Icon(Icons.search),
                  prefixIconColor: AppStyle().brandColor,
                  hintText: 'need store name',
                  enabledBorder: OutlineInputBorder(
                    borderSide: BorderSide(
                      color: AppStyle().brandColor,
                      width: 1.5,
                    ),
                    borderRadius: BorderRadius.circular(15),
                  ),
                  focusedBorder: OutlineInputBorder(
                    borderSide: BorderSide(
                      color: AppStyle().brandColor,
                      width: 1.5,
                    ),
                    borderRadius: BorderRadius.circular(15),
                  ),
                ),
              ),
            ),
          ),
        ],
      ),
    );
  }
}

额外说明

  • MaterialType.transparency确保Material组件不会添加额外背景或阴影,完全继承原有样式
  • 该问题仅出现在Hero动画过渡阶段,与页面本身的Scaffold上下文无关

内容的提问来源于stack exchange,提问作者devun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 09:15:31