Фокус TextField застрял, когда выбрана выпадающая кнопка - PullRequest
0 голосов
/ 23 октября 2019

У меня есть текстовое поле и раскрывающееся меню, оба управляются блоком. У меня проблема в том, что как только текстовое поле будет выделено, оно не потеряет фокус, если пользователь попытается что-то выбрать из выпадающего меню. Меню появляется, а затем мгновенно исчезает, и фокус все еще остается на текстовом поле.

Вот базовое приложение, которое демонстрирует проблему:

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(
              mainAxisSize: MainAxisSize.min,
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text('To: '),
                StreamBuilder<String>(
                    stream: formBloc.selectedUser,
                    builder: (context, snapshot) {
                      return DropdownButton(
                          items: userMenuItems,
                          value: snapshot.data,
                          onChanged: formBloc.selectUser);
                    }),
              ],
            ),

            // amount - text field
            Row(
              mainAxisSize: MainAxisSize.min,
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text('Amount: '),
                Container(
                    width: 100.0,
                    child: StreamBuilder<double>(
                        stream: formBloc.billAmount,
                        builder: (context, snapshot) {
                          return TextField(
                            keyboardType: TextInputType.number,
                            onChanged: formBloc.newBillAmount,
                          );
                        })),
              ],
            ),
          ],
        ),
      ),
    );
  }
}

class FormBloc {
  StreamController<String> _selectedUserController = StreamController<String>();
  Stream<String> get selectedUser =>
      _selectedUserController.stream;
  Function get selectUser => _selectedUserController.sink.add;

  //Amount
  StreamController<double> _billAmountController = StreamController<double>();
  Stream<double> get billAmount =>
      _billAmountController.stream;
  void newBillAmount(String amt) =>
      _billAmountController.sink.add(double.parse(amt));


  void dispose() {
    _selectedUserController.close();
    _billAmountController.close();
  }
}

Нужно ли вручную объявлять FocusNode для textField и сообщать ему, когда следует отказаться от фокуса? Или есть какая-то другая причина, по которой текстовое поле привлекает все внимание?

1 Ответ

0 голосов
/ 23 октября 2019

Эта проблема решена и объединена с основным каналом флаттера
https://github.com/flutter/flutter/pull/42482

Это позволяет избежать того факта, что в настоящее время у нас не может быть раскрывающегося списка и текстового поля на одной странице. потому что клавиатура, исчезающая, когда раскрывающийся список получает фокус, вызывает изменение метрик, и раскрывающийся список немедленно исчезает при активации.

...