【问题标题】:flutter:: Can a variable be used in another file?flutter:: 变量可以在另一个文件中使用吗?
【发布时间】:2021-11-29 22:29:43
【问题描述】:

home.dart

class HomePage extends StatefulWidget {

  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  late Directory? appDir;
  late List<String>? records;

record.dart

class Records extends StatefulWidget {
  final List<String> records;
  const Records({
    Key? key,
    required this.records,
  }) : super(key: key);

  @override
  _RecordsState createState() => _RecordsState();
}

app.dart

class App extends GetView<AppController>{ 
  const App({Key? key}) : super(key: key);
  static const PrimaryColor1 = const Color(0xFF708FF8);


  @override
  Widget build(BuildContext context){
    return Scaffold(
        body: Obx(() {
          switch(RouteName.values[controller.currentIndex.value]) {
            case RouteName.Home:
              return Home();
              break;

            case RouteName.Record:
              return Record(records: records);

我需要在 app.dart 中返回 Record(records: records)。变量记录在 home.dart 中。有没有办法在 app.dart 中使用变量记录?

+) 我尝试如下更改它,但打印了“recordnull”。

home.dart

class video_Body extends StatefulWidget {
  video_Body({Key? key, required this.index}) : super(key: key);
  @override
  _video_Body createState() => _video_Body();
  int index;
  static List<String>? records;
}

class _video_Body extends State<video_Body> {
  List<String>? get record => video_Body.records;

app.dart

    if(video_Body.records == null) print('recordnull');
      return Record(records: video_Body.records);  

【问题讨论】:

  • 这与在单独的文件中无关。如果您的所有代码都在一个文件中,您也会遇到同样的问题。

标签: flutter dart


【解决方案1】:

有几种方法可以做你想做的事,这是我能想到的两种最简单的方法:

1。将变量存储在其他地方。

很难解释如何执行此操作,因为我对主页对记录列表所做的操作知之甚少,但总体思路是在 app.dart 文件中声明记录列表并传递将列表的值放入Home 类中。

为此,当Home 类想要编辑列表时,您可能必须声明某种回调,我给您举个例子:

在这个例子中,我们有一个显示数字的按钮小部件,当您按下按钮时,它会增加数字的值,我们想要访问数字的当前值。

首先,我将向您展示与您的问题相同的情况:

按钮:

class MyButton extends StatefulWidget {
  ...
}
class _MyButtonState extends State<MyButton> {
 
  int value = 0;

  @override
  Widget build(BuildContext) {
    return ElevatedButton(
      child: Text(value.toString()),
      onPressed: () => setState(() => value++),
    );
  }
}

首页:

class Home extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        MyButton(), 
        Text(buttonText), // how do we access the button text?????
      ]
    );
  }
}

现在,有了解决方案:

按钮:

class MyButton extends StatelessWidget {
  MyButton({required this.value, required this.onChange});

  final void Function(int) onChange;
  final int value;  

  @override
  Widget build(BuildContext) {
    return ElevatedButton(
      child: Text(value.toString()),
      onPressed: () => onChange(value +1),
    );
  }
}

首页:

class Home extends StatefulWidget {
  ...
}

class _HomeState extends State<Home> {

  int value = 0;

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        MyButton(onChange: (v) => setState(() => value=v), value: value), 
        Text(value.toString()),
      ]
    );
  }
}

当然,根据具体情况,此解决方案可能不适合您。

2。使用静态类

这里的想法是将你要访问的变量移动到一个静态类中,首先你需要用你要访问的静态变量创建一个类:

class RecordsService {
  static List<String>? records;
}

因为它是静态的,所以你可以从任何地方访问它,所以在家里,进行以下更改:

之前:

late List<String>? records;

之后:

List<String>? get records => RecordService.records;

并访问应用程序上的值:

return Record(records: RecordService.records);

希望这些解决方案之一可以解决您的用例。

【讨论】:

  • 感谢您的回答。我尝试了第二种解决方案,但我得到了错误“null check operator used on a null value”。我认为记录列表未交付。
  • 你能说明你在哪里得到这个错误吗?你是在使用静态类还是移动了变量?
  • 我在帖子下方添加了额外的注释。你能再看看我的帖子吗?
  • 是的,抱歉,但我仍然很难理解错误发生在哪里,但我可以想到两种可能性:1. 发生错误是因为您分配records,如果是这样,那么给records一个默认值并使其不可为空将修复它,或者只是在任何地方添加空检查。第二种可能性是静态类正在更新,但小部件没有重建,take a look at this question 可能在这方面的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-15
  • 1970-01-01
  • 2011-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多