首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在两个不同的文件之间传递变量并对它们进行操作

如何在两个不同的文件之间传递变量并对它们进行操作
EN

Stack Overflow用户
提问于 2021-06-11 17:29:30
回答 2查看 2.5K关注 0票数 1

我正在学习颤振,我想知道如何在两个不同的文件之间传递变量或方法(添加额外的小部件)。在我的示例中,当我们创建一个新项目时,我使用了flutter提供的代码,在这个代码中,我添加了第二个名为"second.dart“的文件,其中我在文件主"main.dart”中获得了变量"_counter“,并将其乘以10。

main.dart

代码语言:javascript
复制
import 'package:flutter/material.dart';
import 'second.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      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> {

  int _counter = 0;
  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
            Container(
              child: Second(),
            ),
          ],
        ),
      ),

      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}

second.dart

代码语言:javascript
复制
import 'package:flutter/material.dart';
import 'main.dart';

class Second extends StatefulWidget {
  @override
  _SecondState createState() => _SecondState();
}

class _SecondState extends State<Second> {
  
  int counter10 = _MyHomePageState._counter * 10;


  @override
  Widget build(BuildContext context) {
    return Container(
      color: Colors.red,
      width: 200,
      height: 300,
      child: Text('My increment * 10 : $counter10 '),
    );
  }
}

但是,我有这个错误。“_MyHomePageState”用红色高亮显示。

lib/附议. not :11:18:错误: Getter未找到:'_MyHomePageState‘。var counter10 =_MyHomePageState._counter * 10;

谢谢你的帮助

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-11 17:50:03

请注意,这不是我们将变量传递给其他文件或其他小部件的方式。要创建一个小部件,您需要在有状态或无状态之间进行选择,如果要从Second class内部操作状态,则将其声明为有状态小部件,但在您的示例中,您需要有一个无状态小部件。

例如:

代码语言:javascript
复制
    class Second extends StatelessWidget {
      final int counter;
    
      const Second({Key key, this.counter}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return  Container(
      color: Colors.red,
      width: 200,
      height: 300,
      child: Text('My increment * 10 : ${counter * 10} '));
      }
    }

并从第一个变量中传递这个变量,如下所示:

代码语言:javascript
复制
import 'package:flutter/material.dart';
import 'second.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      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> {

  int _counter = 0;
  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
            Container(
              child: Second(counter:_counter),
            ),
          ],
        ),
      ),

      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}

注意:您可以通过跨类引用它们来共享正常变量,但是它们不应该是私有的,例如在它们前面有一个_ 。另一件事是,即使您共享变量,它也不会直接对第二页产生任何影响,因为颤振不知道它正在改变,而只是将其作为一个实例来处理。

可以使用类共享静态数据:示例

代码语言:javascript
复制
class AppStrings {
static Color appColor = Colors.blue;
} 

稍后将其命名为AppStrings.appColor

票数 1
EN

Stack Overflow用户

发布于 2021-06-11 17:46:53

在你的代码中有几点你应该做:

  1. 当我们使用下划线作为变量名的第一个字符时,它意味着这个变量是私有的!所以您不能在第二个小部件中使用int counter10 = _MyHomePageState._counter * 10;

如果要将变量传递给子小部件,则需要创建如下构造函数:

代码语言:javascript
复制
    class Second extends StatefulWidget {
    
      int counter;
    
      Second(this.counter);
      @override
      _SecondState createState() => _SecondState();
    }

  1. 现在您可以将_countre变量传递给第二个小部件:

代码语言:javascript
复制
    Container(
                  child: Second(_counter),
                ),

如果有什么问题或错误,请告诉我。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67941246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档