【问题标题】:Creating model with contains list of widget flutter创建包含小部件颤振列表的模型
【发布时间】:2020-11-16 21:27:28
【问题描述】:

嗨,我是 Flutter 的新手,现在我正在创建这样的屏幕模型(screen_model.dart)

class ScreenModel{
  final String title;
  final Widget screen;
  final List<Widget> actions;

  ScreenModel({@required this.titleScreen, @required this.widgetScreen, this.actions});
}

然后当我尝试在 main.dart 中初始化模型时

  final List<Widget> defaultActions = [
IconButton(
    icon: Icon(Icons.filter_list, color: Colors.white), onPressed: null),
IconButton(icon: Icon(Icons.add, color: Colors.white), onPressed: null)
];

final List<ScreenModel> _widgetOptions = [
ScreenModel(title: 'Purchasing', screen: PurchasingScreen(),actions: defaultactions)
];

我收到错误“无法在初始化程序中访问实例成员 'defaultActions'。 尝试用不同的表达式替换对实例成员的引用” 如何解决这个问题? 提前谢谢

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    您可以在下面复制粘贴运行完整代码
    您可以在 initState() 中使用 init _widgetOptions

      List<ScreenModel> _widgetOptions;
    
      @override
      void initState() {
        _widgetOptions = [
          ScreenModel(
              title: 'Purchasing',
              screen: PurchasingScreen(),
              actions: defaultActions)
        ];
        super.initState();
      }
    

    工作演示

    完整代码

    import 'package:flutter/material.dart';
    
    class ScreenModel {
      final String title;
      final Widget screen;
      final List<Widget> actions;
    
      ScreenModel({@required this.title, @required this.screen, this.actions});
    }
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
            visualDensity: VisualDensity.adaptivePlatformDensity,
          ),
          home: MyHomePage(title: 'Flutter Demo Home Page'),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      MyHomePage({Key key, this.title}) : super(key: key);
    
      final String title;
    
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      final List<Widget> defaultActions = [
        IconButton(
            icon: Icon(Icons.filter_list, color: Colors.blue), onPressed: null),
        IconButton(icon: Icon(Icons.add, color: Colors.blue), onPressed: null)
      ];
    
      List<ScreenModel> _widgetOptions;
    
      @override
      void initState() {
        _widgetOptions = [
          ScreenModel(
              title: 'Purchasing',
              screen: PurchasingScreen(),
              actions: defaultActions)
        ];
        super.initState();
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text(widget.title),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: _widgetOptions[0].actions,
            ),
          ),
        );
      }
    }
    
    class PurchasingScreen extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Container();
      }
    }
    

    【讨论】:

    • 太棒了,你能解释一下为什么我必须使用 initState 吗?实际上我正在使用屏幕模型来切换带有底部导航的屏幕,在我将自定义操作的 list 添加到 screenModel 之前一切正常,并且我没有使用 initstate。
    • 系统在第一次遇到类时为类变量分配内存。那时 defaultActions 的内存地址是未知的。
    猜你喜欢
    • 2019-01-13
    • 2020-09-07
    • 1970-01-01
    • 2018-11-12
    • 2022-01-25
    • 2021-08-03
    • 2020-01-17
    • 2020-10-28
    • 2021-10-12
    相关资源
    最近更新 更多