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

在ListView中加载自定义BookingCalendar组件报错:No Material widget found

问题排查与解决

错误根源

"No Material widget found"的核心问题是:你用到的Text、CircularProgressIndicator,以及BookingCalendar内部可能依赖的Material风格组件,在Widget树的上层没有找到提供Material上下文的组件(比如MaterialApp、Scaffold、Material)。

两种修复方法

方法一:给ListView套一层Material

直接在ListView.builder外层添加Material组件,为内部组件提供必要的上下文:

@override
Widget build(BuildContext context) {
  return SizedBox(
    height: 1000,
    child: Material(
      child: ListView.builder(
          shrinkWrap: true,
          scrollDirection: Axis.horizontal,
          itemCount: bookingList.length,
          itemBuilder: (context, index) {
            return Column(
              children: [
                BookingCalendar(
                    bookingService: bookingCalendarModel,
                    convertStreamResultToDateTimeRanges: convertStreamResultMock,
                    getBookingStream: getBookingStreamMock,
                    uploadBooking: uploadBookingMock,
                    pauseSlots: generatePauseSlots(),
                    hideBreakTime: false,
                    loadingWidget: const Text('Fetching data...'),
                    uploadingWidget: const CircularProgressIndicator(),
                    locale: 'en_US',
                    startingDayOfWeek: CalendarDays.monday,
                    wholeDayIsBookedWidget: const Text('Fully booked! Choose another day'),
                    disabledDates: [DateTime(2023, 1, 20)],
                    disabledDays: [6, 7])
              ],
            );
          }),
    ),
  );
}

方法二:用Scaffold包裹整个页面

如果这个Widget是页面级内容,直接把它放在Scaffold的body中,Scaffold自带Material上下文:

class UserCalendarPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('用户日历列表')),
      body: SizedBox(
        height: 1000,
        child: ListView.builder(
          // 原有的ListView配置代码
        ),
      ),
    );
  }
}

额外注意

  • 确认你的App根组件已经包含MaterialApp,它是所有Material风格组件的基础上下文提供者,没有的话必须在最外层添加。
  • BookingCalendar不管是自定义还是第三方组件,只要内部用到了Material风格的控件(比如按钮、输入框),就必须依赖上层的Material上下文。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 04:01:14