【问题标题】:Why can't I call my changecolor function inside a class?为什么我不能在一个类中调用我的 changecolor 函数?
【发布时间】:2022-08-19 01:53:14
【问题描述】:

我想调用 \"changecolor();\" 函数,但它在不同的类中。

class AppBarPage extends StatelessWidget implements PreferredSizeWidget {
  const AppBarPage({Key? key}) : super(key: key);

  @override
  Size get preferredSize => const Size.fromHeight(100);

  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: Scaffold(
          drawer: const Drawer(),
          appBar: AppBar(
            backgroundColor: Colors.pink.shade400,
            toolbarHeight: 100,
            elevation: 14,
            shape: const RoundedRectangleBorder(
                // ignore: unnecessary_const
                borderRadius: const BorderRadius.only(
                    bottomRight: Radius.circular(70),
                    bottomLeft: Radius.circular(70))),
            title: const Text(
              \'Rick and Morty\',
            ),
            actions: [
              Row(
                children: [
                  Container(
                    height: 40,
                    width: 40,
                    alignment: Alignment.center,
                    // ignore: prefer_const_literals_to_create_immutables
                    decoration: BoxDecoration(boxShadow: [
                      const BoxShadow(
                          blurRadius: 7, spreadRadius: 3, color: Colors.pink)
                    ], shape: BoxShape.circle, color: Colors.pink.shade400),
                    child: IconButton(
                      icon: const Icon(Icons.settings),
                      onPressed: () {
                        
                        changecolor();
                        
                      },
                    ),

如您所见,在最后一部分中,我希望我的卡片在调用该函数时改变颜色。这里是另一个班级

class _HomeRickState extends State<HomeRick> {
  Color color = const Color.fromARGB(243, 247, 243, 243);

  void changecolor() {
    setState(() {
      if (color == Color.fromARGB(243, 247, 243, 243)) {
        color = Color.fromARGB(243, 241, 220, 237);
      } else {
        color = Color.fromARGB(243, 247, 243, 243);
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: const AppBarPage(),
      body: SafeArea(
        child: Card(
          color: color,
          //color: Color.fromARGB(243, 241, 220, 237),

两者都在同一个文件中。 老实说,我正在学习。我想问题出在“AppBarPage”类,因为它是一个无状态小部件,但是当我想将它转换为一个 staefullwidget 时,它给了我一个错误。

  • 我不相信您可以在完全不同的小部件中调用 setState 并对当前小部件产生任何影响。

标签: flutter


【解决方案1】:

编辑:更正了我最初的答案

尝试向 Stateful Widget 添加一个键。 当你调用函数changecolor() 时,你认为 dart 会识别它来自哪里。事实并非如此 。该函数归 HomeRickState 所有。所以你需要创建一个密钥!

什么是钥匙?我也是初学者,所以我会尽力解释。它是一种访问有状态小部件状态及其功能的方法。可以这样想: 当你有一个正常的类:

class MyClass{
  int i = 0;
  void printThis(){
   print(i);
  }
}

你这样调用函数:

MyClass someName = MyClass();

someName.printThis();

你必须做同样的事情,但是这一次它是一个状态,而不是一个普通的类或小部件。所以你创建了一个密钥!

首先将_HomeRickState 重命名为HomeRickState

然后将其添加到代码的顶部 GlobalKey&lt;HomeRickState&gt; homeKey = GlobalKey();

之后,转到您的main.dart 文件。并将MaterialApp 小部件的home 属性从home: const HomeRick() 更改为home: HomeRick(key: homeKey)

当你调用 changecolor() 函数时,像这样调用它:

homeKey.currentState!.changecolor();

让我知道它是否有效

【讨论】:

  • 你好先生。抱歉没早点回答,没电了。 .. 这没用。
  • 我不知道把“GlobalKey<_HomeRickState> homeKey = GlobalKey();”放在哪里我把它放在 changecolor 函数之上,但它抛出了一个 undefined_indefinier
  • 在您文件的顶部,任何地方。在全球范围内。不在更改颜色功能内
  • 是的,我的坏。不要删除我之前告诉你的东西并添加以下内容。将您的_HomeRickState 重命名为HomeRickState。然后转到您的主文件。在 MaterialApp 小部件下有一个 home: 属性。将home: const HomeRick() 更改为home: HomeRick(key: homeKey)。如果它不起作用,请告诉我。我现在没有 IDE,所以我可能错过了一些东西
  • 我爱你,非常感谢
【解决方案2】:

要从另一个类调用函数而不创建其实例,您必须使其成为静态 使函数静态以及函数中访问的字段使它们也是静态的,然后您可以从另一个类中调用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    相关资源
    最近更新 更多