问题描述
谁能解释为什么我会收到此错误以及如何修复它?
我使用我的 _page() 函数来创建我的主页,但是现在我已经为 MyHomePage 创建了一个新文件,它给了我那个类型错误。如果我删除 context.read 行的“作为容器”部分,我会收到不同的错误。
无论如何,我对“作为容器”部分有点困惑,但我认为这与 Flutter 2.0 有关,因为它在我迁移到 2.0 之后才出现。
在查看此错误时,我看到我应该尝试重新启动应用程序,所以我这样做了,它似乎有效,直到我切换到其他页面,然后尝试切换回主页,即当我收到错误时。
我不确定这对这个错误是否重要,但我使用 Riverpod 进行状态管理。
my_drawer.dart:
class MyDrawer extends StatefulWidget {
MyDrawer({Key? key}) : super(key: key);
@override
_MyDrawerState createState() => _MyDrawerState();
}
class _MyDrawerState extends State<MyDrawer> {
Widget _homePage = MyHomePage();
Widget _galleryPage = _page(Colors.white,"gallery");
Widget _bookAppPage = _page(Colors.white,"Book An Appointment");
Widget _aboutUsPage = _page(Colors.white,"About Us");
Widget _contactUsPage = _page(Colors.white,"Contact Us");
Widget _settingsPage = _page(Colors.white,"Settings");
@override
void initState() {
super.initState();
WidgetsBinding.instance!.addPostFrameCallback((_) {
context.read(fragmentProvider).state = _homePage as Container;
});
}
...
...
...
// Temp function to create the rest of the pages
_page(Color color,String title) {
return Container(
height: double.infinity,width: double.infinity,color: color,child: Center(
child: Text(
'$title',style: TextStyle(fontSize: 30,color: Colors.black),),);
}
这是 MyHomePage 类:
class MyHomePage extends StatefulWidget {
MyHomePage({Key? key}) : super(key: key);
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: MyAppBar(),drawer: MyDrawer(),body: Stack(
children: [
Text("Home"),Consumer(
builder: (context,watch,_) {
final body = watch(fragmentProvider).state;
return body;
},],);
}
}
解决方法
您试图将 _homePage
转换为 Container
,但 _homePage
是 MyHomePage
的实例,它是 StatefulWidget
。您的所有其他页面实际上都包含在 Container
中,因此这些转换会成功。
我不确定 context.read(fragmentProvider).state
的类型是什么,因此在没有更多信息的情况下,很难说这里的实际修复是什么。
来自此代码:
context.read(fragmentProvider).state = _homePage as Container;
用小部件替换容器:
context.read(fragmentProvider).state = _homePage as Widget;
,
为了得到我想要的结果,我重构了我的代码。我没有使用 Riverpod 并尝试使用状态管理在页面之间切换,而是选择了内置的 Navigator
和 MaterialPageRoute
小部件在抽屉中的页面之间导航。
我为每个 context.read()
行替换了此代码。
Navigator.push(context,MaterialPageRoute(builder: (context) => new MyHomePage()));
我删除了 Consumer 小部件以及所有 Widget _...Page = ...;
行。我也摆脱了我的 _page()
函数,继续为每个页面创建基本页面,然后将它们导入 my_drawer.dart。
正如 Alex Hartford 在评论中所说的那样,我试图使用 Riverpod 在每个页面之间切换,只是让一切变得复杂。
进行这些更改后,应用程序的行为完全符合我的需要。感谢所有回复并帮助我的人。我真的很感激!