如何在另一个类中使用创建的列表?

Posted

技术标签:

【中文标题】如何在另一个类中使用创建的列表?【英文标题】: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]))

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

【问题讨论】:

【参考方案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,它可以帮助您简化对状态对象的访问。

【讨论】:

以上是关于如何在另一个类中使用创建的列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在另一个类中调用类类型的向量?

如何将小部件连接到在一个类中声明的自定义信号,同时在另一个类中

如何在 java 类方法中连接到我的数据库 sql 并在另一个类中调用它?

如何在另一个类中使用 onActivityResult

如何在另一个类中使用带有构造函数的类?

如何在一个类中创建 CoreData 实体并在另一个类中访问?