Flutter文本字段状态管理插件textfield_state的使用

发布于 1周前 作者 wuwangju 来自 Flutter

Flutter文本字段状态管理插件 textfield_state 的使用

textfield_state 是一个帮助类,用于在 State 和其 Widgets 中维护 TextEditingController 和/或 FocusNode。这个插件可以帮助开发者更方便地管理文本字段的状态和焦点。

示例代码

以下是一个完整的示例 Demo,展示了如何使用 textfield_state 插件来管理不同场景下的文本字段状态。

主入口文件 main.dart

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

/// Demo 1 - state only
class Demo1 extends StatefulWidget {
  [@override](/user/override)
  _Demo1State createState() => _Demo1State();
}

class _Demo1State extends State<Demo1> {
  late final TextFieldState state;

  [@override](/user/override)
  void initState() {
    state = TextFieldState(
      textChanged: _rebuild,
      focusChanged: _rebuild,
      primaryFocusChanged: _rebuild,
      text: 'Demo 1 - state only',
    );
    super.initState();
  }

  void _rebuild(_) => setState(() {});

  [@override](/user/override)
  void dispose() {
    state.dispose();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) => DemoTextField(state);
}

/// Demo 2 - widget defined
class Demo2 extends StatefulWidget {
  const Demo2(this.controller, this.focusNode);

  final TextEditingController controller;
  final FocusNode focusNode;

  [@override](/user/override)
  _Demo2State createState() => _Demo2State();
}

class _Demo2State extends State<Demo2> {
  late final TextFieldState state;

  [@override](/user/override)
  void initState() {
    state = TextFieldState(
      textChanged: _rebuild,
      focusChanged: _rebuild,
      primaryFocusChanged: _rebuild,
      controller: widget.controller,
      focusNode: widget.focusNode,
    );
    super.initState();
  }

  void _rebuild(_) => setState(() {});

  [@override](/user/override)
  void didUpdateWidget(Demo2 oldWidget) {
    state.update(controller: widget.controller, focusNode: widget.focusNode);
    super.didUpdateWidget(oldWidget);
  }

  [@override](/user/override)
  void dispose() {
    state.dispose();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) => DemoTextField(state);
}

/// Demo 3 - text only
class Demo3 extends StatefulWidget {
  const Demo3(this.text);
  final String text;
  [@override](/user/override)
  _Demo3State createState() => _Demo3State();
}

class _Demo3State extends State<Demo3> {
  late final TextFieldState state;

  [@override](/user/override)
  void initState() {
    state = TextFieldState(
      textChanged: _rebuild,
      focusChanged: _rebuild,
      primaryFocusChanged: _rebuild,
      text: widget.text,
    );
    super.initState();
  }

  void _rebuild(_) => setState(() {});

  [@override](/user/override)
  void didUpdateWidget(Demo3 oldWidget) {
    state.update(text: widget.text);
    super.didUpdateWidget(oldWidget);
  }

  [@override](/user/override)
  void dispose() {
    state.dispose();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) => DemoTextField(state);
}

/// Helper for dumping info, shows connection to TextField.
class DemoTextField extends StatelessWidget {
  const DemoTextField(this.state);
  final TextFieldState state;
  [@override](/user/override)
  Widget build(BuildContext context) => TextField(
        controller: state.controller,
        focusNode: state.focusNode,
        decoration: InputDecoration(
          helperText: 'focused: ${state.focusNode.hasFocus}, '
              'primary: ${state.focusNode.hasPrimaryFocus}\n'
              'text: ${state.controller.text}\n'
              'controller instance: ${state.controller.hashCode}\n'
              'focusNode instance: ${state.focusNode.hashCode}',
          helperMaxLines: 5,
        ),
      );
}

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

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  /// There's a Flutter issue when creating a FocusNode on every build.
  /// See https://stackoverflow.com/a/57586327/884522.
  final focusNode = FocusNode();

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'TextFieldState Demo',
      theme: ThemeData(
        inputDecorationTheme: InputDecorationTheme(border: OutlineInputBorder()),
      ),
      home: Scaffold(
        appBar: AppBar(title: Text('TextFieldState Demo')),
        body: SingleChildScrollView(
          child: Container(
            padding: EdgeInsets.all(32),
            child: Column(
              children: <Widget>[
                Demo1(),
                SizedBox(height: 24),
                Demo2(TextEditingController(text: 'Demo 2 - widget defined'), focusNode),
                SizedBox(height: 24),
                Demo3('Demo 3 - text only'),
                SizedBox(height: 24),
                ElevatedButton(
                  child: Text('Rebuild'),
                  onPressed: () => setState(() {}),
                )
              ],
            ),
          ),
        ),
      ),
    );
  }
}

更多关于Flutter文本字段状态管理插件textfield_state的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter文本字段状态管理插件textfield_state的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用Flutter中的textfield_state插件来管理文本字段状态的示例代码。这个插件可以帮助你更方便地管理文本字段的焦点、值和验证状态等。

首先,你需要在你的pubspec.yaml文件中添加textfield_state依赖:

dependencies:
  flutter:
    sdk: flutter
  textfield_state: ^x.y.z  # 请替换为最新版本号

然后运行flutter pub get来安装依赖。

接下来是一个完整的示例,展示了如何使用textfield_state来管理文本字段:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'TextField State Management',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> with TextFieldControllerMixin {
  // 创建TextFieldStateController实例
  final emailController = TextFieldStateController();
  final passwordController = TextFieldStateController();

  @override
  void dispose() {
    // 释放控制器资源
    emailController.dispose();
    passwordController.dispose();
    super.dispose();
  }

  void _submitForm() {
    // 验证表单字段
    if (emailController.text.isEmpty || !emailController.isValid) {
      emailController.setError('请输入有效的电子邮件地址');
      emailController.requestFocus();
      return;
    }
    if (passwordController.text.isEmpty || passwordController.text.length < 6) {
      passwordController.setError('密码长度不能少于6个字符');
      passwordController.requestFocus();
      return;
    }

    // 如果验证通过,则处理表单提交
    print('Email: ${emailController.text}');
    print('Password: ${passwordController.text}');
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('TextField State Management Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: <Widget>[
            TextFieldStateWidget(
              controller: emailController,
              labelText: 'Email',
              validators: [
                (String value) {
                  final emailRegex = RegExp(
                      r"^[a-zA-Z0-9.a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-\.]+\.[a-zA-Z]{2,}$");
                  return emailRegex.hasMatch(value) ? null : '无效的电子邮件地址';
                },
              ],
            ),
            SizedBox(height: 16.0),
            TextFieldStateWidget(
              controller: passwordController,
              labelText: 'Password',
              obscureText: true,
              validators: [
                (String value) {
                  return value.length >= 6 ? null : '密码长度不能少于6个字符';
                },
              ],
            ),
            SizedBox(height: 24.0),
            ElevatedButton(
              onPressed: _submitForm,
              child: Text('提交'),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们做了以下事情:

  1. 创建TextFieldStateController实例:用于管理每个文本字段的状态。
  2. dispose方法中释放控制器资源:以防止内存泄漏。
  3. 使用TextFieldStateWidget来构建文本字段:通过传递controllervalidators等参数来管理文本字段的状态和验证。
  4. 处理表单提交:在_submitForm方法中,我们检查每个文本字段的验证状态,如果验证通过,则处理表单提交。

这样,你就可以很方便地使用textfield_state插件来管理Flutter应用中的文本字段状态了。

回到顶部