Dead Code/Flutter_Dart

[플러터] class 이름을 string 값을 참조해서 불러오기

2020. 1. 31.



class 이름과 동일한 string 값이 있다. 

class를 불러올때, 이 string 값을 class 이름으로 사용하고 싶다.

 

매우 간단할 줄 알았는데, 그냥 하면 안된다. (당연한건가..)

 

더 재밌는건, 패키지 중에, 이걸 또 변환해 주는 패키지가 있다는 점이다.

 

 

ClassBuilder 패키지 사용 예시이다.

나의 경우는, MaterialApp 부분에 route를 사용할때, 이름을 사전정의해야하는데,

이게 또 귀찮아서...

 

불러올 이름들을 stiring리스트로 만들고 불러오기 했다. 

 

발영어는 조심하시길..

 

 

아주 ~~~ 약간 덜 귀찮게 해주는 신박한 패키지.

 

 

///
/// ##string 값을 class 이름으로 사용하기##
/// ClassBuilder Package 사용
///
/// class 이름을 list<string> 으로 선언
/// 초기화 할때, class builder 사용
/// ClassBuilder.fromString으로 사용
///
import 'package:class_builder/class_builder.dart';
import 'package:flutter/material.dart';

main() => runApp(MaterialApp(
      home: Main(),
    ));

class Main extends StatefulWidget {
  @override
  _MainState createState() => _MainState();
}

class _MainState extends State<Main> {
  final List<String> classList = ['SecondPage1', 'SecondPage2'];

  @override
  void initState() {
    super.initState();

    ClassBuilder.register(() => SecondPage1(classList));
    ClassBuilder.register(() => SecondPage2());
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            FlatButton(
              child: Text('go'),
              onPressed: () => Navigator.of(context).push(MaterialPageRoute(
                  builder: (context) => ClassBuilder.fromString(classList[0]))),
            ),
            FlatButton(
              child: Text('go'),
              onPressed: () => Navigator.of(context).push(MaterialPageRoute(
                  builder: (context) => ClassBuilder.fromString(classList[1]))),
            ),
          ],
        ),
      ),
    );
  }
}

class SecondPage1 extends StatelessWidget {
  final List<String> classList;
  SecondPage1(this.classList);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: Center(
        child: Container(
          width: 200,
          height: 200,
          color: Colors.red,
          child: Text('${classList[0]}'),
        ),
      ),
    );
  }
}

class SecondPage2 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: Center(
        child: Container(
          width: 200,
          height: 200,
          color: Colors.blue,
        ),
      ),
    );
  }
}