【问题标题】:Flutter: How to change the state of a variable in another dart file?Flutter:如何更改另一个 dart 文件中变量的状态?
【发布时间】:2021-01-21 15:36:27
【问题描述】:

我目前正在开发一个应用程序;我想更改在另一个 dart 文件中声明的 String 的值,然后将更改后的状态传递给有状态小部件。

IE;

  1. 我创建了一个名为“Body.dart”的文件,我在其中声明了一个名为“scale”的字符串,其值最初为“Empty”。

  2. 稍后当按下另一个 dart 文件“scale_button”中的按钮时,我想在我的 Body.dart 文件中分配字符串 scale = “Hello”。这样有状态的小部件也会在屏幕上显示相同的内容。

【问题讨论】:

  • 分享您的代码示例。
  • 这是全局状态管理,如果你没有研究任何东西,那么我相信这个flutter doc 应该可以帮助你。

标签: flutter dart


【解决方案1】:

在这种情况下,您可以使用provider(或任何其他状态管理)包。在yaml文件中添加provider: ^4.3.2+4

class HomeApp extends StatefulWidget {
  @override
  _HomeAppState createState() => _HomeAppState();
}

class _HomeAppState extends State<HomeApp> {
  StringProvider _stringProvider;

  @override
  void initState() {
    super.initState();
    _stringProvider = Provider.of<StringProvider>(context, listen: false);
  }

  void updateString() {
    _stringProvider.setString('hai');
  }

  @override
  Widget build(BuildContext context) {
    StringProvider _stringProvider = Provider.of<StringProvider>(context);
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Container(
              child: Text(
                _stringProvider.str,
                style: TextStyle(
                  fontSize: 22,
                ),
              ),
            ),
            RaisedButton(
              onPressed: updateString,
              child: Text('Click'),
            ),
          ],
        ),
      ),
    );
  }
}
// class for storing data(StringProvider.dart)
import 'package:flutter/material.dart';

class StringProvider extends ChangeNotifier { // create a common file for data
  String _str = 'hello';

  String get str => _str;

  void setString(String st) {
    _str = st;
    notifyListeners();
  }
}

【讨论】:

  • Balaji,感谢您提供整数代码。但是你能告诉我如何对字符串做同样的事情吗?我希望能够在按下按钮时更改字符串值。
  • @AkellaNiranjan 我已经更新了字符串的代码。让我知道这是否有效
  • 您好 Balaji,我想在不同的 dart 文件中执行“_stringProvider.setString('hai')”。您上面给出的代码只有在我尝试在同一个 dart 文件中设置新字符串时才有效。但相反,我想将新字符串设置在不同的 dart 文件中。
  • @AkellaNiranjan,您只能使用这种方法,您可以在任何需要的地方引用值,也可以在任何地方更改值。您可以采用相同的方法
  • Venkataraman,你能不能再帮我做一件事,你知道如何在颤振应用程序中产生声音吗?就像我目前正在开发像“Tanpura”这样的音乐应用程序。你能告诉我如何在颤动中生成我自己的各种频率的声音。
【解决方案2】:

当您创建一个新的 Flutter 项目时,计数器的示例代码会向您展示如何执行此操作。查看下一个代码中的 cmets:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      // here is passing a String to MyHomePage.
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  // And here you can see how to make the widget wait for a variable 
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

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

Sample Counter App 完整代码

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @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,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ), 
    );
  }
}

【讨论】:

  • 这不起作用,请提供完整代码
  • Belaji,你只需要打开Android Studio o VS code,新建一个flutter项目,新建项目的时候,自带了一个counter app的例子,我放的代码就是来自那里,
  • @FerBueroTrebino 您的解决方案仅在我更改同一个 dart 文件中的值时才有效。但我需要的是我想更改不同 dart 文件中字符串的值,它应该反映在当前的 dart 文件中。
  • @FerBueroTrebino 我知道它是在创建颤振应用程序时作为颤振示例出现的。问题是如果你在这里回答它应该是清晰和有用的
  • @AkellaNiranjan 我试图通过简单的解释帮助您实现它,但 JustCase 昨天给出了正确答案。 “这是全局状态管理,如果您没有进行任何研究,那么我相信这个 Flutter 文档应该可以帮助您。”
猜你喜欢
  • 2021-07-01
  • 1970-01-01
  • 2021-03-21
  • 2021-12-26
  • 2021-03-24
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多