Flutter中StatefulWidget继承下访问widget属性报错问题咨询
问题分析与解决
报错原因
你的代码核心问题是抽象State类继承时丢失了泛型约束,导致widget的类型被推导为顶层的Widget1,而非实际的Widget3:
Widget2State继承Widget1State时未指定泛型参数,默认等价于Widget2State extends Widget1State<Widget1>,因此Widget2State中widget的类型是Widget1。Widget3State继承Widget2State后,widget的类型依然是Widget1,而Widget1没有定义i字段,所以触发报错。- 额外注意:原代码中
Widget3的i是final字段,即使类型正确,widget.i = 0也会因为无法修改final变量而报错。
修复方案
给每个抽象State类添加正确的泛型约束,让类型信息在继承链中正确传递,同时调整i的修饰符(如果需要修改它):
步骤1:修正抽象State类的泛型
- 让
Widget2State继承Widget1State<T>,并约束T为Widget2的子类,确保类型链延续。 Widget3State继承Widget2State时,指定泛型为Widget3,这样widget的类型会被正确推导为Widget3。
步骤2:调整i的修饰符
如果需要在State中修改i,将Widget3中的final int i改为int i(final变量不可修改)。
完整修正代码
import 'package:flutter/material.dart'; abstract class Widget1 extends Widget1 { const Widget1({super.key}); } abstract class Widget1State<T extends Widget1> extends State<T> { @override Widget build(BuildContext context) { return Container(); // 抽象实现 } } abstract class Widget2 extends Widget1 { const Widget2({super.key}); } // 给Widget2State添加泛型约束,限定T是Widget2的子类 abstract class Widget2State<T extends Widget2> extends Widget1State<T> { @override Widget build(BuildContext context) { return Container(); // 抽象实现 } } class Widget3 extends Widget2 { // 移除final,允许修改i int i; Widget3(this.i, {super.key}); @override State<Widget3> createState() => Widget3State(); } // 指定泛型为Widget3,让widget的类型正确指向Widget3 class Widget3State extends Widget2State<Widget3> { void a() { // 现在可以正常访问并修改widget.i widget.i = 0; } }
内容的提问来源于stack exchange,提问作者FreddyBoy
相关产品推荐
相关产品推荐

