【问题标题】:Syntax highlighter doesn't expand to show all code语法荧光笔不会展开以显示所有代码
【发布时间】:2019-07-18 05:19:19
【问题描述】:

我正在尝试提供一个代码编辑器,它从文本表单字段获取输入并使用 DartSyntaxHighlighter 在富文本小部件上显示输出。

虽然它适用于较短的 sn-p 代码,但它不会显示较大 sn-p 的所有代码。这是我到目前为止所做的:

class CodeEditorWidget extends StatefulWidget {

  CodeEditorWidget();

  @override
  _ContentWidgetState createState() {
    return _ContentWidgetState();
  }
}

class _ContentWidgetState extends BaseState<CodeEditorWidget> {

  String _currentCode = "";

  @override
  void initializeData() {
    _currentCode = "class HelloWorld {\n"
        "public static void main() {\n"
        "System.out.println(\"Hello again\");\n"
        "}\n"
        "}";
    _contentController.addListener(() {
      _currentCode = _contentController.value.text;
      setState(() {

      });
    });
  }

  @override
  Widget build(BuildContext context) => _buildContent();

  Widget _buildContent() {
    //return _buildBody();
    userState = AppStateWidget.of(context).userState;
    return _buildBody();
  }

  Scaffold _buildBody() => Scaffold(
    key: _scaffoldLoginKey,
    appBar: buildAppBar("Code Editor"),
    body: _buildCodeEditor(),
    floatingActionButtonLocation: FloatingActionButtonLocation.endFloat,
    floatingActionButton: _buildFab(),
  );

  _buildCodeEditor() => Card(
    margin: const EdgeInsets.fromLTRB(BaseState.horizontalMargin, 0, BaseState.horizontalMargin, 0),
    child: Column(
      children: <Widget>[
        Expanded(
          child: _buildCodeView()//buildSyntaxCodeBlock(_currentCode, 12)//_buildCodeView(),
        ),
        _buildInputContainer()
      ],
    ),
  );

  _buildCodeView() => SingleChildScrollView(
    scrollDirection: Axis.vertical,
    child: Padding(
      padding: const EdgeInsets.all(16.0),
      child: Container(
        width: double.infinity,
        height: double.maxFinite,
        padding: EdgeInsets.all(12),
        decoration: BoxDecoration(color: Colors.black),
        child: RichText(
          text: TextSpan(
            style: TextStyle(fontFamily: 'VarelaRound-Regular', fontSize: 12),
            children: <TextSpan>[
              DartSyntaxHighlighter(SyntaxHighlighterStyle.darkThemeStyle()).format(_currentCode)
            ],
          ),
        ),
      ),
    ),
  );

  Container _buildInputContainer() {
    return Container(
      color: Colors.grey,
      padding: EdgeInsets.all(8),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: <Widget>[
          _buildInputLayout(),
        ],
      ),
    );
  }

  _buildInputLayout() => Row(
    mainAxisAlignment: MainAxisAlignment.spaceEvenly,
    children: <Widget>[_buildTextForm()],
  );

  Widget _buildTextForm() => Flexible(
    child: Container(
      color: Colors.white,
      child: Padding(
        padding: const EdgeInsets.all(8.0),
        child: TextFormField(
          style: buildTextStyleBlack(16),
          decoration: InputDecoration.collapsed(hintText: "Type here..."),
          maxLines: 10,
          validator: _validateEmptyCode,
          controller: _contentController,
          keyboardType: TextInputType.multiline,
          onSaved: (String contentString) {
            //_currentCode = contentString;
          },
        ),
      ),
    ),
  );

  String _validateEmptyCode(String value) {
    return value.isEmpty ? "Required" : null;
  }

  var _contentController = TextEditingController();

  _buildFab() => FloatingActionButton(
    onPressed: () {
      setState(() {

      });
    },
    child: Icon(Icons.add),
    foregroundColor: Colors.white,
    backgroundColor: Colors.green,
  );

  var _scaffoldLoginKey = GlobalKey<ScaffoldState>();

  _showSnackBar(String message) => _scaffoldLoginKey.currentState
      .showSnackBar(SnackBar(content: Text(message, style: buildTextStyle(16),)));

}

这是一个屏幕截图供参考:

这是我尝试用 Flutter 构建的网页。

【问题讨论】:

  • 你能详细说明你想要的吗?似乎您想要一个 TextField 文本到另一个很大的 TextField 中,在某些操作上?对吗?
  • 考虑以上 2 个小部件,一个用于编写代码,另一个用于查看预览。理想的情况是能够直接编写代码,并在文本表单字段中突出显示语法。通过上面的实现,只要用户开始在编辑器中输入一些代码[下],我就设置代码预览部分[上]。 @MuhammadNoman
  • 表示您希望在代码编写小部件发生更改时同步更新预览字段?
  • 是的,没错。
  • 查看答案

标签: flutter dart flutter-layout


【解决方案1】:

对我来说,这段代码正在做你想做的事情。

TextEditingController text1Controller = new TextEditingController();
TextEditingController text2Controller = new TextEditingController();

@override
  Widget build(BuildContext context) {

    Size screenSize = MediaQuery.of(context).size;

    return new Scaffold(
      backgroundColor: Colors.white,
      appBar: new PreferredSize(
        preferredSize: new Size(screenSize.width, 55.0),
        child: new AppBar(
          elevation: 5.0,
          title : new Text(
              "Code Editor",
              style: new TextStyle(
                  color: Colors.white,
                  fontWeight: FontWeight.bold,
                  fontSize: 18.0)),
          centerTitle: true,
          backgroundColor: Colors.blue,
        ),
      ),
      body: Container(
        child: Column(
          children: <Widget>[
            new Padding(padding: EdgeInsets.only(bottom: 20.0, top: 20.0)),
            new TextField(
              onChanged: (text) {
                setState(() {
                  text2Controller.text = text;
                });
              },
              controller: text1Controller,
              keyboardType: TextInputType.text,
              autofocus: false,
              decoration: InputDecoration(
                contentPadding: EdgeInsets.fromLTRB(20.0, 10.0, 20.0, 10.0),
                focusedBorder: OutlineInputBorder(borderSide: const BorderSide(color: Colors.black, width: 2.0)),
              ),
            ),
            new Padding(padding: EdgeInsets.only(bottom: 20.0)),
            new TextField(
              controller: text2Controller,
              keyboardType: TextInputType.text,
              autofocus: false,
              decoration: InputDecoration(
                contentPadding: EdgeInsets.fromLTRB(20.0, 10.0, 20.0, 10.0),
                focusedBorder: OutlineInputBorder(borderSide: const BorderSide(color: Colors.black, width: 2.0)),
              ),
            )
          ],),),
    );
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 2021-12-27
    • 1970-01-01
    相关资源
    最近更新 更多