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
,但 _homePage
是 MyHomePage
的一个实例,后者是 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 并尝试使用状态管理在页面之间切换,而是选择了内置的 Navigator
和 MaterialPageRoute
小部件在抽屉中的页面之间导航。
我为每个 context.read()
行替换了这段代码。
Navigator.push(context,
MaterialPageRoute(builder: (context) => new MyHomePage()));
我删除了 Consumer 小部件以及所有 Widget _...Page = ...;
行。我也摆脱了我的 _page()
功能,只是继续为每个页面创建基本页面,然后将它们导入 my_drawer.dart.
正如 Alex Hartford 在评论中所说的那样,我试图使用 Riverpod 在每个页面之间切换,这让一切都变得过于复杂。
进行这些更改后,应用程序的行为完全符合我的需要。感谢所有回复并帮助我的人。非常感谢!
任何人都可以解释为什么我会收到此错误以及如何解决它吗?
我正在使用我的 _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
,但 _homePage
是 MyHomePage
的一个实例,后者是 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 并尝试使用状态管理在页面之间切换,而是选择了内置的 Navigator
和 MaterialPageRoute
小部件在抽屉中的页面之间导航。
我为每个 context.read()
行替换了这段代码。
Navigator.push(context,
MaterialPageRoute(builder: (context) => new MyHomePage()));
我删除了 Consumer 小部件以及所有 Widget _...Page = ...;
行。我也摆脱了我的 _page()
功能,只是继续为每个页面创建基本页面,然后将它们导入 my_drawer.dart.
正如 Alex Hartford 在评论中所说的那样,我试图使用 Riverpod 在每个页面之间切换,这让一切都变得过于复杂。
进行这些更改后,应用程序的行为完全符合我的需要。感谢所有回复并帮助我的人。非常感谢!