如何通过setState()更新TextFormField的initialValue,而这并没有发生



这是我的设置。dart

import 'package:flutter/material.dart';
import 'package:upm/file_manager.dart';
import 'package:upm/screens/home.dart';
import 'package:upm/screens/login.dart';
import 'package:upm/screens/signup.dart';
class Settings extends StatefulWidget {
  static const FileStorage storage = FileStorage();
  const Settings({Key? key}) : super(key: key);
  @override
  State<Settings> createState() => _SettingsState();
}
class _SettingsState extends State<Settings> {
  late Map<String, dynamic> config;
  @override
  void initState() {
    super.initState();
    config = {};
    getData().then((value) {
      setState(() {
        config = value;
      });
    });
  }
  Future<Map<String, dynamic>> getData() async {
    config = await const FileStorage().readConfig();
    print("Ye lo config ${config["serverIP"]}");
    return config;
  }
  @override
  Widget build(BuildContext context) {
    const String name = "Settings";
    return Scaffold(
      appBar: AppBar(
        title: const Text(name),
      ),
      body: Container(
        padding:
            const EdgeInsets.only(left: 15, right: 15, bottom: 15, top: 15),
        child: Center(
          child: Column(
            children: [
              TextFormField(
                initialValue: config["serverIP"].toString(),
                decoration: const InputDecoration(
                  labelText: 'Server IP',
                  border: OutlineInputBorder(),
                ),
              ),
              const SizedBox(
                height: 15,
              ),
              const TextField(
                decoration: InputDecoration(
                  labelText: 'Server Port',
                  border: OutlineInputBorder(),
                ),
              ),
              const SizedBox(
                height: 25,
              ),
              const ElevatedButton(
                onPressed: null,
                child: Text("Save"),
              )
            ],
          ),
        ),
      ),
      drawer: Drawer(
        child: ListView(
          padding: EdgeInsets.zero,
          children: [
            ListTile(
              title: const Text('Home'),
              onTap: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(builder: (context) => const Home()),
                );
              },
            ),
            ListTile(
              title: const Text('Sign In'),
              onTap: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(builder: (context) => const Login()),
                );
              },
            ),
            ListTile(
              title: const Text('Sign Up'),
              onTap: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(builder: (context) => const Signup()),
                );
              },
            ),
          ],
        ),
      ),
    );
  }
}

这是我的file_manager.dart

import 'dart:convert';
import 'dart:io';
import 'package:flutter/cupertino.dart';
import 'package:path_provider/path_provider.dart';
class FileStorage extends StatelessWidget {
  const FileStorage({Key? key}) : super(key: key);
  Future<String> get _localPath async {
    final directory = await getApplicationDocumentsDirectory();
    return directory.path;
  }
  Future<File> get _localFileConfig async {
    final path = await _localPath;
    if (await File("$path/config.ini").exists() == false) {
      File("$path/config.ini").create();
      Map<String, dynamic> config = {
        "serverIP": "0.0.0.0",
        "port": 1234,
      };
      writeConfig(config);
    }
    File file = File("$path/config.ini");
    return file;
  }
  Future<Map<String, dynamic>> readConfig() async {
    try {
      final file = await _localFileConfig;
      String temp = await file.readAsString();
      Map<String, dynamic> contents = await jsonDecode(temp);
      print("Ye Lo contents $contents");
      return contents;
    } catch (e) {
      print("Ye bhi Parh Lo-T $e -T");
      return <String, dynamic>{};
    }
  }
  Future<File> writeConfig(Map<String, dynamic> config) async {
    final file = await _localFileConfig;
    return file.writeAsString(json.encode(config));
  }
  @override
  Widget build(BuildContext context) {
    throw UnimplementedError();
  }
}

我试图从本地文件中获取一个json映射,并使用其中一个键和值作为settings.dart中initialValue的变量;空";并且不更新。

您将只能第一次设置初始值,之后默认情况下不会响应。最好使用TextEditingController

在状态类上声明一个变量。

 TextEditingController controller =
      TextEditingController.fromValue(TextEditingValue(text: "initValue"));
 @override
  void initState() {
    super.initState();
    config = {};
    getData().then((value) {
        controller.text = value; // controller doent need setState to update
       
    });
  }

并使用控制器

  TextFormField(
    controller: controller,
  )

相关内容

最新更新