我有一个文本字段和一个下拉菜单,都由 Bloc 控制。我遇到的问题是,一旦文本字段被选中,如果用户然后尝试从下拉菜单中选择某些内容,它就不会放弃焦点。菜单出现然后瞬间消失,焦点仍然在文本字段上。
这是一个演示问题的基本应用程序:
import 'dart:async';
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Textfield Focus Example',
home: HomePage(),
);
}
}
class HomePage extends StatelessWidget {
FormBloc formBloc = FormBloc();
final List<DropdownMenuItem> userMenuItems = ['Bob', 'Frank']
.map((String name) => DropdownMenuItem(
value: name,
child: Text(name),
))
.toList();
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
// user - drop down menu
Row( …Run Code Online (Sandbox Code Playgroud) 在使用 导航到新上下文后,我尝试访问在应用程序根附近创建的 bloc 实例showDialog()。但是,如果我尝试像平常一样获取块,通过从上下文中获取它,例如_thisBlocInstance = BlocProvider.of<ThisBlocType>(context),我会收到一条错误,表明此上下文中没有提供块。
我认为这是因为showDialog()构建器方法为对话框中的小部件分配了一个新的上下文,这些小部件不知道我正在尝试查找的块,该块在用户登录后立即实例化:
@override
Widget build(BuildContext context) {
_authBloc = BlocProvider.of<AuthBloc>(context);
_accountBloc = AccountBloc(authBloc: _authBloc);
return BlocProvider(
bloc: _accountBloc,
....
Run Code Online (Sandbox Code Playgroud)
角落里有一个按钮,显示一个对话框:
@override
Widget build(BuildContext context) {
return Align(
alignment: Alignment.bottomRight,
child: Padding(
padding: const EdgeInsets.all(18.0),
child: FloatingActionButton(
onPressed: () => showDialog(
context: context,
builder: (newContext) => EventDialog(),
).then(
(val) => print(val)
),
child: Icon(Icons.add),
),
),
);
}
Run Code Online (Sandbox Code Playgroud)
在 EventDialog 中,我尝试再次找到具有上下文的块:
@override
void build(BuildContext context) {
_accountBloc = BlocProvider.of<AccountBloc>(context);
_userMenuItems …Run Code Online (Sandbox Code Playgroud)