从多个小部件访问 StreamController Stream
Access StreamController Stream from multiple widgets
嗨,我是 Flutter 和 Streams、BLoC 和提供商的新手。
我正在尝试从两个不同的小部件访问流。虽然它在一个小部件中有效,但在另一个小部件中不起作用。我在两个小部件中都有单独的流构建器,我认为这可能是问题所在。为什么它不起作用?我哪里做错了没看懂?
带有流控制器和流的 BloC:
String dialCode = "";
class LogInController {
final dialCodeStreamController = StreamController<String>();
Stream<String> get dialCodeStream => dialCodeStreamController.stream;
final dialCodeUpdateStreamController = StreamController<String>();
Sink<String> get dialCodeSink => dialCodeUpdateStreamController.sink;
Stream<String> get dialCodeUpdateStream =>
dialCodeUpdateStreamController.stream;
LogInController() {
dialCodeUpdateStream.listen((updatedDialCode) {
dialCode = updatedDialCode;
dialCodeStreamController.add(dialCode);
});
}
void dispose() {
dialCodeStreamController.close();
dialCodeUpdateStreamController.close();
}
}
流正在运行的小部件:
class CountryCodeWidget extends StatelessWidget {
final LogInController controller = LogInController();
@override
Widget build(BuildContext context) {
return Container(
margin: const EdgeInsets.fromLTRB(12, 12, 12, 8),
child: Card(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
Text(
selectCountryCodeString,
style: hintTextStyle,
),
StreamBuilder<String>(
stream: controller.dialCodeStream,
initialData: "",
builder: (context, snapshot) {
return Container(
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(
color: snapshot.data == ""
? whiteColor
: secondaryColor,
width: 4,
),
),
),
child: Padding(
padding: const EdgeInsets.all(4.0),
child: Text(
'${snapshot.data}',
style: textStyle,
),
),
);
}),
FlatButton(
color: secondaryColor,
child: Icon(
Icons.keyboard_arrow_down,
color: textColor,
),
onPressed: () => countryCodeDialog(context),
),
],
),
),
),
);
}
流不工作的小部件:
class MobileNumberWidget extends StatelessWidget {
final LogInController controller = LogInController();
final mobileNumberController = TextEditingController();
@override
Widget build(BuildContext context) {
return Container(
margin: const EdgeInsets.fromLTRB(12, 0, 12, 8),
child: Card(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
Expanded(
child: Padding(
padding: const EdgeInsets.all(4.0),
child: TextField(
controller: mobileNumberController,
keyboardType: TextInputType.phone,
style: textStyle,
decoration: InputDecoration(
hintText: mobileNumberHintString,
hintStyle: hintTextStyle,
enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(
color: hintTextColor,
width: 1,
),
),
focusedBorder: UnderlineInputBorder(
borderSide: BorderSide(
color: textColor,
width: 2,
),
),
),
),
),
),
StreamBuilder<String>(
stream: controller.dialCodeStream,
initialData: "",
builder: (context, snapshot) {
return FlatButton(
child: Icon(
Icons.done,
color: textColor,
),
onPressed: () => mobileNumberController.text.length == 10
? snapshot.data == ""
? showSnackBar(
context, selectCountryCodeSnackBarString)
: //sendOTP(mobileNumberController.text)
showSnackBar(context, "YEs")
: showSnackBar(context, mobileNumberLengthString),
);
}),
],
),
),
),
);
}
}
让我知道我是否可以更好地解释我的问题,或者我是否没有道理。谢谢。
找到问题和解决方案。问题是两次初始化流控制器。我在父部件中初始化并将其传递给子部件。
嗨,我是 Flutter 和 Streams、BLoC 和提供商的新手。
我正在尝试从两个不同的小部件访问流。虽然它在一个小部件中有效,但在另一个小部件中不起作用。我在两个小部件中都有单独的流构建器,我认为这可能是问题所在。为什么它不起作用?我哪里做错了没看懂?
带有流控制器和流的 BloC:
String dialCode = "";
class LogInController {
final dialCodeStreamController = StreamController<String>();
Stream<String> get dialCodeStream => dialCodeStreamController.stream;
final dialCodeUpdateStreamController = StreamController<String>();
Sink<String> get dialCodeSink => dialCodeUpdateStreamController.sink;
Stream<String> get dialCodeUpdateStream =>
dialCodeUpdateStreamController.stream;
LogInController() {
dialCodeUpdateStream.listen((updatedDialCode) {
dialCode = updatedDialCode;
dialCodeStreamController.add(dialCode);
});
}
void dispose() {
dialCodeStreamController.close();
dialCodeUpdateStreamController.close();
}
}
流正在运行的小部件:
class CountryCodeWidget extends StatelessWidget {
final LogInController controller = LogInController();
@override
Widget build(BuildContext context) {
return Container(
margin: const EdgeInsets.fromLTRB(12, 12, 12, 8),
child: Card(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
Text(
selectCountryCodeString,
style: hintTextStyle,
),
StreamBuilder<String>(
stream: controller.dialCodeStream,
initialData: "",
builder: (context, snapshot) {
return Container(
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(
color: snapshot.data == ""
? whiteColor
: secondaryColor,
width: 4,
),
),
),
child: Padding(
padding: const EdgeInsets.all(4.0),
child: Text(
'${snapshot.data}',
style: textStyle,
),
),
);
}),
FlatButton(
color: secondaryColor,
child: Icon(
Icons.keyboard_arrow_down,
color: textColor,
),
onPressed: () => countryCodeDialog(context),
),
],
),
),
),
);
}
流不工作的小部件:
class MobileNumberWidget extends StatelessWidget {
final LogInController controller = LogInController();
final mobileNumberController = TextEditingController();
@override
Widget build(BuildContext context) {
return Container(
margin: const EdgeInsets.fromLTRB(12, 0, 12, 8),
child: Card(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
Expanded(
child: Padding(
padding: const EdgeInsets.all(4.0),
child: TextField(
controller: mobileNumberController,
keyboardType: TextInputType.phone,
style: textStyle,
decoration: InputDecoration(
hintText: mobileNumberHintString,
hintStyle: hintTextStyle,
enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(
color: hintTextColor,
width: 1,
),
),
focusedBorder: UnderlineInputBorder(
borderSide: BorderSide(
color: textColor,
width: 2,
),
),
),
),
),
),
StreamBuilder<String>(
stream: controller.dialCodeStream,
initialData: "",
builder: (context, snapshot) {
return FlatButton(
child: Icon(
Icons.done,
color: textColor,
),
onPressed: () => mobileNumberController.text.length == 10
? snapshot.data == ""
? showSnackBar(
context, selectCountryCodeSnackBarString)
: //sendOTP(mobileNumberController.text)
showSnackBar(context, "YEs")
: showSnackBar(context, mobileNumberLengthString),
);
}),
],
),
),
),
);
}
}
让我知道我是否可以更好地解释我的问题,或者我是否没有道理。谢谢。
找到问题和解决方案。问题是两次初始化流控制器。我在父部件中初始化并将其传递给子部件。