【问题标题】:Flutter: Type 'MyHomePage' is not a subtype of type 'Container' in type castFlutter:类型“MyHomePage”不是类型转换中“Container”类型的子类型
【发布时间】:2021-03-17 18:29:26
【问题描述】:

谁能解释我收到此错误的原因以及如何解决?

我正在使用我的 _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;     
            },    
          ),
        ],
      ),
    );
  }
}      

【问题讨论】:

  • 考虑为每个页面创建一个枚举,然后更改您的片段提供程序以提供该枚举,然后使用地图根据枚举决定显示哪个页面,而不是将小部件存储在提供程序中。我不认为你做错了,但很奇怪。
  • 我会研究一下,但我对 Flutter 还是很陌生,老实说不知道如何去做。如果您发现任何可以帮助我的链接,请发送!
  • 老实说,您的事情过于复杂,强烈建议您在继续之前查看官方和第三方示例:riverpod.dev/docs
  • 我将阅读文档并尝试更好地了解如何使用 Riverpod,因为这是我使用 Riverpod 的第一个项目。我昨天查看了枚举和地图,但我仍然不确定如何正确使用它。希望我最终能弄清楚。感谢您的帮助,我真的很感激。顺便说一句,您提供的链接不起作用,但我假设您的意思是这个链接:[link](riverpod.dev/docs/getting_started)

标签: flutter dart state-management riverpod


【解决方案1】:

您试图将_homePage 转换为Container,但_homePageMyHomePage 的一个实例,它是StatefulWidget。您的所有其他页面实际上都包含在 Container 中,因此这些转换会成功。

我不确定context.read(fragmentProvider).state 的类型是什么,所以如果没有更多信息,很难说这里的实际修复是什么。

【讨论】:

  • 我曾试图将其设为“作为 Scaffold”,因为这是 MyHomePageState 在 build 方法中返回的内容。然而,那行不通。在其他人回复这篇文章之前,我没想过尝试“作为 Widget”,但这也不起作用。我可以向您展示的代码的任何其他部分可以帮助您找到 context.read(fragmentProvider).state 的类型吗?我的 fragmentProvider 看起来像这样,''' final fragmentProvider = StateProvider((ref) => Container()); '''
【解决方案2】:

从此代码:

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

用小部件替换容器:

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

【讨论】:

  • 将其更改为“作为小部件”会导致应用程序无法编译。这是我收到的错误。 “错误:‘Widget’类型的值不能分配给‘Container’类型的变量”
  • 然后在你的 fragmentProvider 中用 Widget 替换每个 Container
  • 当我这样做时它也给了我一个错误,但实际上我只是在不使用 Riverpod 的情况下让它工作。我刚刚使用了 Navigator 和 MaterialPageRoute 并且它起作用了。不过感谢您的帮助!
【解决方案3】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 2020-03-19
    • 2023-04-07
    • 2022-07-06
    • 2019-05-28
    • 1970-01-01
    相关资源
    最近更新 更多