在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
相关产品推荐
相关产品推荐

