【问题标题】:How to Create a Flutter Widget from a String如何从字符串创建 Flutter 小部件
【发布时间】:2020-03-05 23:26:31
【问题描述】:

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

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

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

【问题讨论】:

    标签: flutter widget


    【解决方案1】:

    您可以在下面复制粘贴运行完整代码
    你可以使用包https://pub.dev/packages/dynamic_widget
    例如https://github.com/dengyin2000/dynamic_widget/tree/master/example
    这个包支持以下从String创建的Widget

    容器、文本、TextSpan、TextStyle、RaisedButton、Row、...

    代码sn-p

    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...");
                },
              ),
            ),
    

    示例代码的工作演示

    完整代码的工作演示

    完整代码

    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),
          ),
        );
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-18
      • 2021-01-15
      • 1970-01-01
      • 1970-01-01
      • 2022-11-21
      • 2020-12-06
      • 1970-01-01
      • 2021-10-29
      相关资源
      最近更新 更多