Flutter:类型“MyHomePage”不是类型转换中“Container”类型的子类型

问题描述

谁能解释为什么我会收到此错误以及如何修复它?

我使用我的 _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,但 _homePageMyHomePage 的实例,它是 StatefulWidget。您的所有其他页面实际上都包含在 Container 中,因此这些转换会成功。

我不确定 context.read(fragmentProvider).state 的类型是什么,因此在没有更多信息的情况下,很难说这里的实际修复是什么。

,

来自此代码:

  context.read(fragmentProvider).state = _homePage as Container;     

用小部件替换容器:

  context.read(fragmentProvider).state = _homePage as Widget;     
,

为了得到我想要的结果,我重构了我的代码。我没有使用 Riverpod 并尝试使用状态管理在页面之间切换,而是选择了内置的 NavigatorMaterialPageRoute 小部件在抽屉中的页面之间导航。

我为每个 context.read() 行替换了此代码。

Navigator.push(context,MaterialPageRoute(builder: (context) => new MyHomePage()));

我删除了 Consumer 小部件以及所有 Widget _...Page = ...; 行。我也摆脱了我的 _page() 函数,继续为每个页面创建基本页面,然后将它们导入 my_drawer.dart。

正如 Alex Hartford 在评论中所说的那样,我试图使用 Riverpod 在每个页面之间切换,只是让一切变得复杂。

进行这些更改后,应用程序的行为完全符合我的需要。感谢所有回复并帮助我的人。我真的很感激!