首页 > 解决方案 > 如何更新 Dart 类变量并刷新颤振状态?

问题描述

我有一个主 dart 文件和一个设置 dart 文件。设置 dart 文件负责主 dart 文件的外观。Settings dart 有一个 AppTheme 类。当用户在此设置页面上键入时,我希望主页更新。

我的尝试是调用类并根据用户输入重新定义变量。无论我是否使用 setState() 都不起作用。我还尝试只停留在主页上,并尝试更改设置按钮的主题 onPressed。那也没有用。Iconbutton 更新也不会更新状态。

import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:resume/settings.dart';


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


class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Title',
      theme: ThemeData.light(),
      home: HomePage(),
    );
  }
}


class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}


class _HomePageState extends State<HomePage> {
  @override
  Widget build(BuildContext context) {

    double buttonMargin = MediaQuery.of(context).size.width / 10;
    double screenWidth = MediaQuery.of(context).size.width;
    double screenHeight = MediaQuery.of(context).size.height;

    return MaterialApp(
      home: Scaffold(
        backgroundColor: AppTheme().backgroundMain,
        body: SafeArea(
          child: Padding(
            padding: const EdgeInsets.fromLTRB(0, 20, 0, 0),
            child: Column(
              children: <Widget>[
                Container(
                  height: (MediaQuery.of(context).size.height / 2.25),
                  child: Column(children: <Widget>[
                    Container(
                      margin: EdgeInsets.all(10),
                      child: Text(AppTheme().name,
                          style: TextStyle(
                              fontFamily: 'Pacifico',
                              fontSize: screenWidth / 8.57142857143,
                              color: AppTheme().nameTextColor,
                              fontWeight: FontWeight.bold)),
                    ),
                  ]),
                ),
                Container(
                  height: screenHeight / 2.3,
                  alignment: Alignment.bottomCenter,
                  child: ListView(
                    scrollDirection: Axis.horizontal,
                    children: <Widget>[
                      Container(
                          margin: EdgeInsets.fromLTRB(
                              buttonMargin * 1.5,
                              buttonMargin * 3,
                              buttonMargin * 1.5,
                              buttonMargin * 3),
                          height: MediaQuery.of(context).size.height / 2,
                          width: MediaQuery.of(context).size.width / 2,
                          child: RaisedButton(
                            color: AppTheme().backgroundSecondary,
                            child: Row(
                              mainAxisAlignment: MainAxisAlignment.center,
                              children: <Widget>[
                                Icon(
                                  Icons.settings,
                                  color: Colors.white,
                                ),
                                Padding(
                                  padding: const EdgeInsets.all(8.0),
                                  child: Text(
                                    'Settings',
                                    style: TextStyle(color: Colors.white),
                                  ),
                                )
                              ],
                            ),
                            onPressed: () {
                              setState(() {
                                Navigator.push(
                                  context,
                                  MaterialPageRoute(builder: (context) {
                                    return MySettings();
                                  }),
                                );
                              },
                              );
                              },
                          ),
                      ),
                    ],
                  ),
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}




settings.dart

import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';

void settings() {
  runApp(MySettings());
}

class AppTheme {
  var backgroundMain = Colors.red;
  var backgroundSecondary = Colors.teal;
  var backgroundAvatar = Colors.white;
  var nameTextColor = Colors.white;
  var professionTextColor = Colors.red[100];
  var contactTextColor = Colors.teal;
  var testPrint = print("hi");

  String name = 'John Doe';

  String nameFont = 'Pacifico';
  String professionFont = 'roboto';
}

class MySettings extends StatefulWidget {
  @override
  MySettingsState createState() => MySettingsState();
}

class MySettingsState extends State<MySettings> {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          backgroundColor: AppTheme().backgroundMain,
          title: Text('Settings'),
          leading: IconButton(
            icon: Icon(Icons.arrow_back),
            onPressed: () {
              setState(() {
                AppTheme().backgroundMain = Colors.yellow;
                print(AppTheme().name);
                Navigator.pop(context);
              });
            },
          ),
        ),
        backgroundColor: Colors.teal,
        body: SafeArea(
            child: ListView(
          children: <Widget>[
            Container(
              child: TextField(
                onChanged: (text) {
                  setState(() {
                    AppTheme().name = text;
                  });
                },
              ),
            ),
            Container(
              child: TextField(),
            ),
          ],
        )),
      ),
    );
  }
}

标签: androidflutterdart

解决方案


1 确保正确导入

Flutter/Dart 静态变量丢失/不断重新初始化

2 你不能改变类中的变量。您必须创建一个对象并更改该对象。

即我在做

Class MyClass {
var myVariable = someValue
}

MyClass.myVariale = aDifferentValue

这没有更新 MyClass 创建对象后我需要做的工作

var myClassObject = new Myclass();
myClassObject.myVariable = aDifferentValue

现在我只需更改并调用 myClassObject。


推荐阅读