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

Flutter: Type 'MyHomePage' is not a subtype of type 'Container' in type cast

任何人都可以解释为什么我会收到此错误以及如何解决它吗?

我正在使用我的 _page() 函数来创建我的主页,但现在我已经为 MyHomePage 创建了一个新文件,它给了我那个类型错误。如果我删除 context.read 行中的“as Container”部分,我会得到一个不同的错误。

无论如何,我对“作为容器”部分有点困惑,但我认为它与 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),
      ),
    ),
  );
}     

这是我的主页class:

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 的类型是什么,因此在没有更多信息的情况下很难说这里的实际修复是什么。

From this code:

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

Replace the Container with Widget:

  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 在每个页面之间切换,这让一切都变得过于复杂。

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