使用 bloc 框架时如何为文本字段提供默认值

cyt*_*n02 9 dart flutter bloc

我编写了一些简单的 flutter 应用程序,它们使用有状态的小部件/表单/文本表单字段来输入和管理数据。现在我正在尝试了解如何使用 BLoC 和流构建器来完成类似的工作。但是我不知道如何为我的字段设置初始值。

我试图创建一个最简单的例子,我可以想出一个使用 bloc 的小应用程序。这只是需要一个输入到 TextField 的名称并将其回显到下一行。

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

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Bloc Example',
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  MyHomePage();

  String initialData = 'Fred';

  @override
  Widget build(BuildContext context) {

    TextEditingController _controller = new TextEditingController();

    return Scaffold(
      appBar: AppBar(title: Text('Bloc Example')),
      body: Center(
        child: Column(
          children: <Widget>[
          StreamBuilder(
            initialData: initialData,
            stream: bloc.nameStream,
              builder: (context, snapshot) {
                if ( snapshot.connectionState == ConnectionState.waiting)
                  _controller.text = snapshot.data;
                return TextField(
                  controller: _controller,
                  onChanged: bloc.nameChangedStream,
                  decoration: InputDecoration(labelText: 'Enter name' ),
                );
              }
            ),
            StreamBuilder(
              initialData: initialData,
              stream: bloc.nameStream, //
              builder: (context, snapshot) {
                return Text('Name is ${snapshot.hasData ? snapshot.data : 'unknown'}');
              }
            ),
          ],
        ),
      ),
    );
  }
}

class Bloc
{
  final nameStreamController = BehaviorSubject<String>();
  Stream<String> get nameStream => nameStreamController.stream;
  Function(String) get nameChangedStream => nameStreamController.sink.add ;
}

final Bloc bloc = new Bloc();
Run Code Online (Sandbox Code Playgroud)

我不知道如何为我的姓名字段指定初始值。

我必须承认,来自旧式编程背景,我需要一段时间才能将我的注意力集中到响应式编程中 - 但向前和向上!

编辑 - 感谢给出的评论 - 更新了代码以使用 TextEditingController 和 StreamBuilder initialData 的组合,并且似乎工作正常。如果有更好的解决方案,很高兴接受进一步的评论:)

non*_*hto 9

通过这样做,您可以为您的 behaviorSubject 提供一个种子值,该值将用作其初始值。

final nameStreamController = BehaviorSubject<String>.seeded('InitialName');  
Run Code Online (Sandbox Code Playgroud)

对于旧版本的 rxDart,请使用

final nameStreamController = BehaviorSubject<String>(seedValue:'InitialName'); 
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

7439 次

最近记录:

6 年,6 月 前