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

How to use a created list in another class?

当我创建列表时,我只能在创建列表的class 中使用它。但是在另一个 class 中,当我想使用列表时出现错误 'undefined name'。我怎样才能访问该列表?

例如,在我的代码中,我创建了一个包含字符串的列表 'plans'。

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]))

我怎样才能访问列表计划?

一个选项是为您的 State class 创建并使用 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 class(您保持 plans 状态的地方object) 需要是它的父对象。我在 .

上解释原因

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