【发布时间】:2019-09-08 20:49:25
【问题描述】:
我编写了一些简单的 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();
我不知道如何为我的姓名字段指定初始值。
我必须承认,我来自旧式编程背景,我需要一段时间才能让我的思想进入反应式编程 - 但越来越多!
编辑 - 感谢给定的 cmets - 更新了代码以使用 TextEditingController 和 StreamBuilder initialData 的组合,并且似乎工作正常。如果有更好的解决方案,很高兴采取进一步的 cmets :)
【问题讨论】:
-
你能提供你使用的解决方案吗?