2017-06-12 4 views
2

Ich muss TextFormField gelegentlich deaktivieren. Ich konnte weder im Widget noch im Controller ein Flag finden, um es einfach nur lesen oder deaktivieren zu lassen. Was ist der beste Weg, es zu tun?Deaktivieren Sie ein Textbearbeitungsfeld im Flattern

+0

Filed https://github.com/flutter/flutter/issues/10645 –

Antwort

4

Dies ist keine Funktion, die derzeit vom Framework bereitgestellt wird. Sie können jedoch eine FocusScope verwenden, um zu verhindern, dass eine TextFormField den Fokus anfordert.

So sieht es aus, wenn es deaktiviert ist.

(mit Hinweistext) empty and readonly

(mit einem Nur-Lese-Wert) readonly

Hier ist, wie es aussieht, wenn es aktiviert ist.

(Schwerpunkt) focused

(ohne Fokus) editable

-Code für diesen unten:

import 'package:flutter/material.dart'; 

void main() { 
    runApp(new MaterialApp(
    home: new HomePage(), 
)); 
} 

class HomePage extends StatefulWidget { 
    HomePageState createState() => new HomePageState(); 
} 

class HomePageState extends State<HomePage> { 

    TextEditingController _controller = new TextEditingController(); 
    bool _enabled = false; 

    @override 
    Widget build(BuildContext context) { 
    ThemeData theme = Theme.of(context); 
    return new Scaffold(
     appBar: new AppBar(
     title: new Text('Disabled Text'), 
    ), 
     floatingActionButton: new FloatingActionButton(
     child: new Icon(Icons.free_breakfast), 
     onPressed:() { 
      setState(() { 
      _enabled = !_enabled; 
      }); 
     } 
    ), 
     body: new Center(
     child: new Container(
      margin: const EdgeInsets.all(10.0), 
      child: _enabled ? 
      new TextFormField(controller: _controller) : 
      new FocusScope(
      node: new FocusScopeNode(), 
      child: new TextFormField(
       controller: _controller, 
       style: theme.textTheme.subhead.copyWith(
       color: theme.disabledColor, 
      ), 
       decoration: new InputDecoration(
       hintText: _enabled ? 'Type something' : 'You cannot focus me', 
      ), 
      ), 
     ), 
     ), 
    ), 
    ); 
    } 
} 
1

Es gibt eine andere Art und Weise dies erreicht werden kann, die auch nicht dazu führen, this issue. Hoffe, das könnte jemandem helfen.

Erstellen Sie AlwaysDisabledFocusNode und übergeben Sie es an die focusNode Eigenschaft einer TextField.

class AlwaysDisabledFocusNode extends FocusNode { 
    @override 
    bool get hasFocus => false; 
} 

dann

new TextField(
    focusNode: new AlwaysDisabledFocusNode(), 
    ... 
    ... 
)