【问题标题】:PlantUML Getting Syntax Error (Flutter/Dart)PlantUML 出现语法错误(颤振/飞镖)
【发布时间】:2021-11-15 15:26:33
【问题描述】:

在 PlantUML 上,我在 Flutter/Dart 上由 dcdg 生成的类图上出现语法错误。第一个错误在第 66 行,如何解决? Planttext.com 或 plantuml-editor.kkeisuke.com 可用于显示 uml。

@startuml
set namespaceSeparator ::

class "covid19stats::chartsData.dart::ChartsData" {
  +ChartData* total
  +ChartData* recovered
  +ChartData* deaths
  +ChartData* vaccine
}

"covid19stats::chartsData.dart::ChartsData" o-- "covid19stats::chartsData.dart::ChartData"

class "covid19stats::chartsData.dart::ChartData" {
  +bool* daily
  +bool* available
  +List<String*>* labels
  +List<int*>* values
  +List<Color*>* gradientColors
}

class "covid19stats::counter.dart::Counter" {
  +Animation<int*>* animation
  +TextStyle* textStyle
  +Widget* build()
}

"covid19stats::counter.dart::Counter" o-- "flutter::src::animation::animation.dart::Animation<int>"
"covid19stats::counter.dart::Counter" o-- "flutter::src::painting::text_style.dart::TextStyle"
"flutter::src::widgets::transitions.dart::AnimatedWidget" <|-- "covid19stats::counter.dart::Counter"

class "covid19stats::countryData.dart::CountryData" {
  +int* totalTests
  +int* testsPerMln
  +int* totalCases
  +double* casesPerMln
  +int* newCases
  +int* totalRecovered
  +int* newRecovered
  +int* activeCases
  +int* totalDeaths
  +double* deathsPerMln
  +int* criticalCases
  +int* newDeaths
  +String* link
  +int* vacTotal
  +int* vacDaily
  +int* vactotalPerHundred
  +int* vacdailyPerMillion
}

class "covid19stats::countryDataVac.dart::CountryDataVac" {
  +int* vacTotal
  +int* vacDaily
  +int* vactotalPerHundred
  +int* vacdailyPerMillion
  +String* date
  +Map<String*, dynamic>* toJson()
}

class "covid19stats::dateRangeDialog.dart::DateRangeDialog" {
  +DateTimeRange* availableRange
  +DateTimeRange* currentRange
  +_DateRangeDialogState* createState()
}

"covid19stats::dateRangeDialog.dart::DateRangeDialog" o-- "flutter::src::material::date.dart::DateTimeR
ange"
"flutter::src::widgets::framework.dart::StatefulWidget" <|-- "covid19stats::dateRangeDialog.dart::DateR
angeDialog"

class "covid19stats::dateRangeDialog.dart::_DateRangeDialogState" {
  +TextEditingController* fromController
  +TextEditingController* toController
  +DateFormat* dateFormat
  +DateTimeRange* selectedRange
  +int* selectedOption
  +DateTimeRange* preset7
  +DateTimeRange* preset28
  +void initState()
  +Widget* build()
  +void checkForPresets()
}

"covid19stats::dateRangeDialog.dart::_DateRangeDialogState" o-- "flutter::src::widgets::editable_text.d
art::TextEditingController"
"covid19stats::dateRangeDialog.dart::_DateRangeDialogState" o-- "intl::intl.dart::DateFormat"
"covid19stats::dateRangeDialog.dart::_DateRangeDialogState" o-- "flutter::src::material::date.dart::Dat
eTimeRange"
"flutter::src::widgets::framework.dart::State" <|-- "covid19stats::dateRangeDialog.dart::_DateRangeDial
ogState"

class "covid19stats::main.dart::MyApp" {
  +Widget* build()
}

"flutter::src::widgets::framework.dart::StatelessWidget" <|-- "covid19stats::main.dart::MyApp"

class "covid19stats::main.dart::MyHomePage" {
  +_MyHomePageState* createState()
}

"flutter::src::widgets::framework.dart::StatefulWidget" <|-- "covid19stats::main.dart::MyHomePage"

class "covid19stats::main.dart::_MyHomePageState" {
  -GlobalKey<State<StatefulWidget*>*>* _refreshIndicatorKey
  -GlobalKey<ScaffoldState*>* _scaffoldKey
  +Map<String*, CountryData*>* countryData
  +Map<String*, CountryDataVac*>* countryDataVac
  +Map<String*, ChartsData*>* chartsData
  +Map<String*, ChartsData*>* chartsDataVac
  +String* country
  +bool* justStarted
  +int* springAnimationDuration
  -AnimationController* _controller
  +ThemeData* datePickerTheme
  +DateTimeRange* selectedDateRange
  +Settings* settings
  +void initState()
  -void _triggerLiquidPullRefresh()
  +Future<void>* refreshData()
  +void dispose()
  +Widget* build()
  +dynamic navigateToSelection()
  +Future<void>* showDateDialog()
  +Future<void>* showSettingsDialog()
  +void checkRangeSetting()
  +Widget* createGraph()
}

"covid19stats::main.dart::_MyHomePageState" o-- "flutter::src::widgets::framework.dart::GlobalKey<State
<StatefulWidget>>"
"covid19stats::main.dart::_MyHomePageState" o-- "flutter::src::widgets::framework.dart::GlobalKey<Scaff
oldState>"
"covid19stats::main.dart::_MyHomePageState" o-- "flutter::src::animation::animation_controller.dart::An
imationController"
"covid19stats::main.dart::_MyHomePageState" o-- "flutter::src::material::theme_data.dart::ThemeData"
"covid19stats::main.dart::_MyHomePageState" o-- "flutter::src::material::date.dart::DateTimeRange"
"covid19stats::main.dart::_MyHomePageState" o-- "covid19stats::settingsDialog.dart::Settings"
"flutter::src::widgets::framework.dart::State" <|-- "covid19stats::main.dart::_MyHomePageState"
"flutter::src::widgets::ticker_provider.dart::TickerProviderStateMixin" <|-- "covid19stats::main.dart::
_MyHomePageState"

class "covid19stats::parser.dart::Parser" {
  {static} +CountryData* parseRow()
  {static} +CountryDataVac* parseRowVac()
  {static} +int* parseInteger()
  {static} +double* parseDouble()
  {static} +String* getInnerString()
  {static} +String* normalizeName()
  {static} +Map<String*, CountryData*>* getCountryData()
  {static} +String* capitalize()
  {static} +Map<String*, CountryDataVac*>* getCountryDataVac()
  {static} +List<String*>* getCategories()
  {static} +List<int*>* getDataPoints()
  {static} +List<String*>* getVacDates()
  {static} +List<int*>* getVacDataPoints()
  {static} +ChartsData* getChartsData()
}

class "covid19stats::selectCountry.dart::SelectionScreen" {
  +List<dynamic>* countries
  +String* selectedCountry
  +_SelectionScreenState* createState()
}

"flutter::src::widgets::framework.dart::StatefulWidget" <|-- "covid19stats::selectCountry.dart::Selecti
onScreen"

class "covid19stats::selectCountry.dart::_SelectionScreenState" {
  +ScrollController* scrollController
  +GlobalKey<State<StatefulWidget*>*>* key
  +Map<String*, String*>* countryFlags
  -TextEditingController* _controller
  +FocusNode* textFieldFocusNode
  +bool* searchFieldVisible
  +List<dynamic>* filteredCountries
  +bool* newSearch
  +void initState()
  +void dispose()
  +void toggleSearchField()
  +Widget* build()
  +Widget* getListTile()
}

"covid19stats::selectCountry.dart::_SelectionScreenState" o-- "flutter::src::widgets::scroll_controller
.dart::ScrollController"
"covid19stats::selectCountry.dart::_SelectionScreenState" o-- "flutter::src::widgets::framework.dart::G
lobalKey<State<StatefulWidget>>"
"covid19stats::selectCountry.dart::_SelectionScreenState" o-- "flutter::src::widgets::editable_text.dar
t::TextEditingController"
"covid19stats::selectCountry.dart::_SelectionScreenState" o-- "flutter::src::widgets::focus_manager.dar
t::FocusNode"
"flutter::src::widgets::framework.dart::State" <|-- "covid19stats::selectCountry.dart::_SelectionScreen
State"

class "covid19stats::settingsDialog.dart::Settings" {
  +bool* defaultDailyView
  +bool* alwaysLoadCharts
  +int* rangeSetting
  +bool* loaded
  +Future<void>* load()
  +Future<bool*>* save()
  +Settings* clone()
  +dynamic []()
}

class "covid19stats::settingsDialog.dart::SettingsDialog" {
  +Settings* settings
  +_SettingsDialogState* createState()
}

"covid19stats::settingsDialog.dart::SettingsDialog" o-- "covid19stats::settingsDialog.dart::Settings"
"flutter::src::widgets::framework.dart::StatefulWidget" <|-- "covid19stats::settingsDialog.dart::Settin
gsDialog"

class "covid19stats::settingsDialog.dart::_SettingsDialogState" {
  +Settings* newSettings
  +void initState()
  +Widget* build()
  +Row* getSwitchRow()
}

"covid19stats::settingsDialog.dart::_SettingsDialogState" o-- "covid19stats::settingsDialog.dart::Setti
ngs"
"flutter::src::widgets::framework.dart::State" <|-- "covid19stats::settingsDialog.dart::_SettingsDialog
State"

class "covid19stats::vaccineCountry.dart::VaccineCountry" {
  +String* country
  +List<Timeline*>* timeline
  +Map<String*, dynamic>* toJson()
}

class "covid19stats::vaccineCountry.dart::Timeline" {
  +int* total
  +int* daily
  +int* totalPerHundred
  +int* dailyPerMillion
  +String* date
  +Map<String*, dynamic>* toJson()
}

class "covid19stats::vaccineData.dart::VaccineData" {
  +int* total
  +int* daily
  +double* totalPerHundred
  +double* dailyPerMillion
  +String* link
}


@enduml

第一个错误:

‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‏ ‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎‏‎ ‎

【问题讨论】:

    标签: uml plantuml


    【解决方案1】:

    看起来问题是由于某些字符串被拆分为多行(复制/过去错误或某些自动编辑器设置为每行 80(?)个字符),即行如下:

    "covid19stats::dateRangeDialog.dart::DateRangeDialog" o-- "flutter::src::material::date.dart::DateTimeR
    ange"
    "flutter::src::widgets::framework.dart::StatefulWidget" <|-- "covid19stats::dateRangeDialog.dart::DateR
    angeDialog"
    

    在完全纠正这个问题时:

    @startuml
    set namespaceSeparator ::
    
    class "covid19stats::chartsData.dart::ChartsData" {
      +ChartData* total
      +ChartData* recovered
      +ChartData* deaths
      +ChartData* vaccine
    }
    
    "covid19stats::chartsData.dart::ChartsData" o-- "covid19stats::chartsData.dart::ChartData"
    
    class "covid19stats::chartsData.dart::ChartData" {
      +bool* daily
      +bool* available
      +List<String*>* labels
      +List<int*>* values
      +List<Color*>* gradientColors
    }
    
    class "covid19stats::counter.dart::Counter" {
      +Animation<int*>* animation
      +TextStyle* textStyle
      +Widget* build()
    }
    
    "covid19stats::counter.dart::Counter" o-- "flutter::src::animation::animation.dart::Animation<int>"
    "covid19stats::counter.dart::Counter" o-- "flutter::src::painting::text_style.dart::TextStyle"
    "flutter::src::widgets::transitions.dart::AnimatedWidget" <|-- "covid19stats::counter.dart::Counter"
    
    class "covid19stats::countryData.dart::CountryData" {
      +int* totalTests
      +int* testsPerMln
      +int* totalCases
      +double* casesPerMln
      +int* newCases
      +int* totalRecovered
      +int* newRecovered
      +int* activeCases
      +int* totalDeaths
      +double* deathsPerMln
      +int* criticalCases
      +int* newDeaths
      +String* link
      +int* vacTotal
      +int* vacDaily
      +int* vactotalPerHundred
      +int* vacdailyPerMillion
    }
    
    class "covid19stats::countryDataVac.dart::CountryDataVac" {
      +int* vacTotal
      +int* vacDaily
      +int* vactotalPerHundred
      +int* vacdailyPerMillion
      +String* date
      +Map<String*, dynamic>* toJson()
    }
    
    class "covid19stats::dateRangeDialog.dart::DateRangeDialog" {
      +DateTimeRange* availableRange
      +DateTimeRange* currentRange
      +_DateRangeDialogState* createState()
    }
    
    "covid19stats::dateRangeDialog.dart::DateRangeDialog" o-- "flutter::src::material::date.dart::DateTimeRange"
    "flutter::src::widgets::framework.dart::StatefulWidget" <|-- "covid19stats::dateRangeDialog.dart::DateRangeDialog"
    
    class "covid19stats::dateRangeDialog.dart::_DateRangeDialogState" {
      +TextEditingController* fromController
      +TextEditingController* toController
      +DateFormat* dateFormat
      +DateTimeRange* selectedRange
      +int* selectedOption
      +DateTimeRange* preset7
      +DateTimeRange* preset28
      +void initState()
      +Widget* build()
      +void checkForPresets()
    }
    
    "covid19stats::dateRangeDialog.dart::_DateRangeDialogState" o-- "flutter::src::widgets::editable_text.dart::TextEditingController"
    "covid19stats::dateRangeDialog.dart::_DateRangeDialogState" o-- "intl::intl.dart::DateFormat"
    "covid19stats::dateRangeDialog.dart::_DateRangeDialogState" o-- "flutter::src::material::date.dart::DateTimeRange"
    "flutter::src::widgets::framework.dart::State" <|-- "covid19stats::dateRangeDialog.dart::_DateRangeDialogState"
    
    class "covid19stats::main.dart::MyApp" {
      +Widget* build()
    }
    
    "flutter::src::widgets::framework.dart::StatelessWidget" <|-- "covid19stats::main.dart::MyApp"
    
    class "covid19stats::main.dart::MyHomePage" {
      +_MyHomePageState* createState()
    }
    
    "flutter::src::widgets::framework.dart::StatefulWidget" <|-- "covid19stats::main.dart::MyHomePage"
    
    class "covid19stats::main.dart::_MyHomePageState" {
      -GlobalKey<State<StatefulWidget*>*>* _refreshIndicatorKey
      -GlobalKey<ScaffoldState*>* _scaffoldKey
      +Map<String*, CountryData*>* countryData
      +Map<String*, CountryDataVac*>* countryDataVac
      +Map<String*, ChartsData*>* chartsData
      +Map<String*, ChartsData*>* chartsDataVac
      +String* country
      +bool* justStarted
      +int* springAnimationDuration
      -AnimationController* _controller
      +ThemeData* datePickerTheme
      +DateTimeRange* selectedDateRange
      +Settings* settings
      +void initState()
      -void _triggerLiquidPullRefresh()
      +Future<void>* refreshData()
      +void dispose()
      +Widget* build()
      +dynamic navigateToSelection()
      +Future<void>* showDateDialog()
      +Future<void>* showSettingsDialog()
      +void checkRangeSetting()
      +Widget* createGraph()
    }
    
    "covid19stats::main.dart::_MyHomePageState" o-- "flutter::src::widgets::framework.dart::GlobalKey<State<StatefulWidget>>"
    "covid19stats::main.dart::_MyHomePageState" o-- "flutter::src::widgets::framework.dart::GlobalKey<ScaffoldState>"
    "covid19stats::main.dart::_MyHomePageState" o-- "flutter::src::animation::animation_controller.dart::AnimationController"
    "covid19stats::main.dart::_MyHomePageState" o-- "flutter::src::material::theme_data.dart::ThemeData"
    "covid19stats::main.dart::_MyHomePageState" o-- "flutter::src::material::date.dart::DateTimeRange"
    "covid19stats::main.dart::_MyHomePageState" o-- "covid19stats::settingsDialog.dart::Settings"
    "flutter::src::widgets::framework.dart::State" <|-- "covid19stats::main.dart::_MyHomePageState"
    "flutter::src::widgets::ticker_provider.dart::TickerProviderStateMixin" <|-- "covid19stats::main.dart::_MyHomePageState"
    
    class "covid19stats::parser.dart::Parser" {
      {static} +CountryData* parseRow()
      {static} +CountryDataVac* parseRowVac()
      {static} +int* parseInteger()
      {static} +double* parseDouble()
      {static} +String* getInnerString()
      {static} +String* normalizeName()
      {static} +Map<String*, CountryData*>* getCountryData()
      {static} +String* capitalize()
      {static} +Map<String*, CountryDataVac*>* getCountryDataVac()
      {static} +List<String*>* getCategories()
      {static} +List<int*>* getDataPoints()
      {static} +List<String*>* getVacDates()
      {static} +List<int*>* getVacDataPoints()
      {static} +ChartsData* getChartsData()
    }
    
    class "covid19stats::selectCountry.dart::SelectionScreen" {
      +List<dynamic>* countries
      +String* selectedCountry
      +_SelectionScreenState* createState()
    }
    
    "flutter::src::widgets::framework.dart::StatefulWidget" <|-- "covid19stats::selectCountry.dart::SelectionScreen"
    
    class "covid19stats::selectCountry.dart::_SelectionScreenState" {
      +ScrollController* scrollController
      +GlobalKey<State<StatefulWidget*>*>* key
      +Map<String*, String*>* countryFlags
      -TextEditingController* _controller
      +FocusNode* textFieldFocusNode
      +bool* searchFieldVisible
      +List<dynamic>* filteredCountries
      +bool* newSearch
      +void initState()
      +void dispose()
      +void toggleSearchField()
      +Widget* build()
      +Widget* getListTile()
    }
    
    "covid19stats::selectCountry.dart::_SelectionScreenState" o-- "flutter::src::widgets::scroll_controller.dart::ScrollController"
    "covid19stats::selectCountry.dart::_SelectionScreenState" o-- "flutter::src::widgets::framework.dart::GlobalKey<State<StatefulWidget>>"
    "covid19stats::selectCountry.dart::_SelectionScreenState" o-- "flutter::src::widgets::editable_text.dart::TextEditingController"
    "covid19stats::selectCountry.dart::_SelectionScreenState" o-- "flutter::src::widgets::focus_manager.dart::FocusNode"
    "flutter::src::widgets::framework.dart::State" <|-- "covid19stats::selectCountry.dart::_SelectionScreenState"
    
    class "covid19stats::settingsDialog.dart::Settings" {
      +bool* defaultDailyView
      +bool* alwaysLoadCharts
      +int* rangeSetting
      +bool* loaded
      +Future<void>* load()
      +Future<bool*>* save()
      +Settings* clone()
      +dynamic []()
    }
    
    class "covid19stats::settingsDialog.dart::SettingsDialog" {
      +Settings* settings
      +_SettingsDialogState* createState()
    }
    
    "covid19stats::settingsDialog.dart::SettingsDialog" o-- "covid19stats::settingsDialog.dart::Settings"
    "flutter::src::widgets::framework.dart::StatefulWidget" <|-- "covid19stats::settingsDialog.dart::SettingsDialog"
    
    class "covid19stats::settingsDialog.dart::_SettingsDialogState" {
      +Settings* newSettings
      +void initState()
      +Widget* build()
      +Row* getSwitchRow()
    }
    
    "covid19stats::settingsDialog.dart::_SettingsDialogState" o-- "covid19stats::settingsDialog.dart::Settings"
    "flutter::src::widgets::framework.dart::State" <|-- "covid19stats::settingsDialog.dart::_SettingsDialogState"
    
    class "covid19stats::vaccineCountry.dart::VaccineCountry" {
      +String* country
      +List<Timeline*>* timeline
      +Map<String*, dynamic>* toJson()
    }
    
    class "covid19stats::vaccineCountry.dart::Timeline" {
      +int* total
      +int* daily
      +int* totalPerHundred
      +int* dailyPerMillion
      +String* date
      +Map<String*, dynamic>* toJson()
    }
    
    class "covid19stats::vaccineData.dart::VaccineData" {
      +int* total
      +int* daily
      +double* totalPerHundred
      +double* dailyPerMillion
      +String* link
    }
    @enduml
    

    一切正常,另见plantUML diagram

    【讨论】:

    • 哦,这是由于 android studio 的拆分副本,有什么办法可以防止这种情况发生吗?非常感谢。
    • 我不知道这是否可能,但请检查您“复制”的程序的设置以及您“粘贴”到的程序的设置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    • 2020-12-25
    • 2020-11-05
    • 2021-12-07
    • 2020-08-12
    • 1970-01-01
    相关资源
    最近更新 更多