【问题标题】:How to use a created list in another class?如何在另一个类中使用创建的列表?
【发布时间】:2021-08-19 15:21:22
【问题描述】:

当我创建一个列表时,我只能在我创建列表的类中使用它。但是在另一个类中,当我想使用列表时,我得到一个错误“未定义的名称”。我如何才能访问该列表?

例如,在我的代码中,我用字符串创建了一个“计划”列表。

class _PlanOverviewState extends State<PlanOverview> {
  List<String> plans = ['Plan A', 'Plan B'];

  void addPlan(String neuerPlan) {
    setState(() {
      plans.add(neuerPlan);
    });
    Navigator.of(context).pop();
  }

现在我想从 Appbar 中另一个 Widget 中的列表计划中输出一个字符串作为标题,以便用户知道他在哪里。

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text(plans[i]))

我如何才能访问列表计划?

【问题讨论】:

    标签: list flutter widget


    【解决方案1】:

    一种选择是为您的State 类创建和使用InheritedWidget 样式的访问器,然后您可以从任何后代context 访问它。

    import 'package:flutter/material.dart';
    
    class InheritedWidgetPage extends StatefulWidget {
      @override
      _InheritedWidgetPageState createState() => _InheritedWidgetPageState();
    
      static _InheritedWidgetPageState of(BuildContext context) =>
          context.findAncestorStateOfType<_InheritedWidgetPageState>();
    }
    
    class _InheritedWidgetPageState extends State<InheritedWidgetPage> {
      List<String> plans = ['Plan A', 'Plan B'];
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: HomePage(),
        );
      }
    }
    
    class HomePage extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        _InheritedWidgetPageState _state = InheritedWidgetPage.of(context);
    
        return Scaffold(
          appBar: AppBar(
            title: Text(_state.plans[0]),
          ),
          body: Center(
            child: ElevatedButton(
              child: Text('Goto ${_state.plans[1]}'),
              onPressed: () => Navigator.of(context).push(
                  MaterialPageRoute(builder: (context) => PlanPage(1))),
            ),
          ),
        );
      }
    }
    
    class PlanPage extends StatelessWidget {
      final int index;
    
      PlanPage(this.index);
    
      @override
      Widget build(BuildContext context) {
        _InheritedWidgetPageState _state = InheritedWidgetPage.of(context);
    
        return Scaffold(
          appBar: AppBar(
            title: Text(_state.plans[index]),
          ),
          body: Center(
            child: Text('You are here: ${_state.plans[index]}'),
          ),
        );
      }
    }
    

    一开始这可能会让人很困惑,但随着您对Flutter's declarative framework 的熟悉,它会变得更有意义。

    要使上面的示例正常工作,您需要有一个 MaterialApp 祖先小部件,并且您的 State 类(您持有 plans 状态对象的位置)需要是它的父级。我在similar question here 上解释了原因。

    您的另一个选择是使用State Management package of which there are lots,它可以帮助您简化对状态对象的访问。

    【讨论】:

      猜你喜欢
      • 2021-02-05
      • 2014-04-12
      • 1970-01-01
      • 2018-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-09
      • 2023-03-16
      相关资源
      最近更新 更多