Flutter 如何从字符串创建颤振小部件

Flutter 如何从字符串创建颤振小部件,flutter,widget,Flutter,Widget,我想把一个实际上是一个小部件的字符串变成一个完整的工作小部件 String container = "Container(color:Colors.red)"; Widget magicFunction(String s){ //Some wizards work } 您可以复制粘贴运行下面的完整代码 您可以使用软件包 示例 此包支持从String 容器、文本、文本跨度、文本样式、RaisedButton、行、… 代码片段 Future<Widget> _buildWidg

我想把一个实际上是一个小部件的字符串变成一个完整的工作小部件

String container = "Container(color:Colors.red)";

Widget magicFunction(String s){
  //Some wizards work 
}

您可以复制粘贴运行下面的完整代码
您可以使用软件包
示例
此包支持从
String

容器、文本、文本跨度、文本样式、RaisedButton、行、…

代码片段

Future<Widget> _buildWidget(BuildContext context) async {
    return DynamicWidgetBuilder()
        .build(containerJson, context, new DefaultClickListener());
  }

Expanded(
          child: FutureBuilder<Widget>(
            future: _buildWidget(context),
            builder: (BuildContext context, AsyncSnapshot<Widget> snapshot) {
              if (snapshot.hasError) {
                print(snapshot.error);
              }
              return snapshot.hasData
                  ? SizedBox.expand(
                      child: snapshot.data,
                    )
                  : Text("Loading...");
            },
          ),
        ),
Future\u buildWidget(BuildContext上下文)异步{
返回DynamicWidgetBuilder()
.build(containerJson,context,newdefaultclicklistener());
}
扩大(
孩子:未来建设者(
未来:_buildWidget(上下文),
生成器:(BuildContext上下文,异步快照){
if(snapshot.hasError){
打印(快照错误);
}
返回snapshot.hasData
?SizedBox.expand(
子:snapshot.data,
)
:文本(“加载…”);
},
),
),
示例代码的工作演示

完整代码的工作演示

完整代码

import 'package:flutter/material.dart';
import 'package:dynamic_widget/dynamic_widget.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class DefaultClickListener implements ClickListener {
  @override
  void onClicked(String event) {
    print("Receive click event: " + event);
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;
  String containerJson = '''
{
  "type": "Container",
  "color": "#FF00FF",
  "alignment": "center",
  "child": {
    "type": "Text",
    "data": "Flutter dynamic widget",
    "maxLines": 3,
    "overflow": "ellipsis",
    "style": {
      "color": "#00FFFF",
      "fontSize": 20.0
    }
  }
}

''';

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  Future<Widget> _buildWidget(BuildContext context) async {
    return DynamicWidgetBuilder()
        .build(containerJson, context, new DefaultClickListener());
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Expanded(
              child: FutureBuilder<Widget>(
                future: _buildWidget(context),
                builder: (BuildContext context, AsyncSnapshot<Widget> snapshot) {
                  if (snapshot.hasError) {
                    print(snapshot.error);
                  }
                  return snapshot.hasData
                      ? SizedBox.expand(
                          child: snapshot.data,
                        )
                      : Text("Loading...");
                },
              ),
            ),
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}
导入“包装:颤振/材料.省道”;
导入“package:dynamic_widget/dynamic_widget.dart”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“颤振演示”,
主题:主题数据(
主样本:颜色。蓝色,
),
主页:MyHomePage(标题:“颤振演示主页”),
);
}
}
类DefaultClickListener实现ClickListener{
@凌驾
void onClicked(字符串事件){
打印(“接收点击事件:+事件”);
}
}
类MyHomePage扩展StatefulWidget{
MyHomePage({Key,this.title}):超级(Key:Key);
最后的字符串标题;
@凌驾
_MyHomePageState createState()=>\u MyHomePageState();
}
类_MyHomePageState扩展状态{
int _计数器=0;
字符串containerJson=''
{
“类型”:“容器”,
“颜色”:“FF00FF”,
“对齐”:“中心”,
“儿童”:{
“类型”:“文本”,
“数据”:“颤振动态小部件”,
“maxLines”:3,
“溢出”:“省略号”,
“风格”:{
“颜色”:“#00FFFF”,
“字体大小”:20.0
}
}
}
''';
void _incrementCounter(){
设置状态(){
_计数器++;
});
}
Future\u buildWidget(BuildContext上下文)异步{
返回DynamicWidgetBuilder()
.build(containerJson,context,newdefaultclicklistener());
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(widget.title),
),
正文:中(
子:列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
扩大(
孩子:未来建设者(
未来:_buildWidget(上下文),
生成器:(BuildContext上下文,异步快照){
if(snapshot.hasError){
打印(快照错误);
}
返回snapshot.hasData
?SizedBox.expand(
子:snapshot.data,
)
:文本(“加载…”);
},
),
),
正文(
“您已经按了这么多次按钮:”,
),
正文(
“$”计数器“,
风格:Theme.of(context).textTheme.headline4,
),
],
),
),
浮动操作按钮:浮动操作按钮(
按下时:\ u递增计数器,
工具提示:“增量”,
子:图标(Icons.add),
),
);
}
}