Как показать локальную строку в StatefulWidget?
Я узнал, как использовать i18n через StatelessWidget для моей практики трепетания, но все еще не работает через StatefulWidget.
Я могу просто заменить следующий код
title: new Text(S.of(context).title)
с константной строкой, например:
title: const Text("A Test Title");
Поэтому я думаю, что все остальное должно быть в порядке. Единственная проблема - i18n не работает.
Может ли какой-нибудь орган помочь мне, "Как использовать i18n через StatefulWidget на флаттере?"
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'generated/i18n.dart';
void main() {
runApp(new MyApp());
}
class MyApp extends StatefulWidget {
MyApp({Key key, this.title}) : super(key: key);
final String title;
@override
_MyAppState createState() => new _MyAppState();
}
class _MyAppState extends State<MyApp> {
BuildContext c;
@override
void initState() {
super.initState();
}
@override
void dispose() {
super.dispose();
}
@override
Widget build(BuildContext context) {
var tiles = new List<Widget>();
return new MaterialApp(
home: new Scaffold(
appBar: new AppBar(
title: new Text(S.of(context).title), // Here is the problem
),
body: new Stack(
children: <Widget>[
new Container(),
new ListView(
children: tiles,
)
],
),
),
localizationsDelegates: [S.delegate],
supportedLocales: S.delegate.supportedLocales,
localeResolutionCallback: S.delegate.resolution(
fallback: new Locale("en", "")
),
);
}
}
1 ответ
context
вы используете не имеет MaterialApp
как родитель. Вместо этого он имеет MaterialApp
как ребенок.
Проблема в, S
Например, вы пытаетесь получить с помощью S.of(context)
хранится внутри MaterialApp
, Отсюда и ошибка.
Вместо этого вы можете использовать другой context
где это context
имеет MaterialApp
у его родителей.
Самый простой способ добиться этого - обернуть часть вашего приложения в Builder
,
Что-то вроде:
return MaterialApp(
home: Builder(
builder: (context) {
const title = S.of(context).title; // works now because the context used has a MaterialApp inside its parents
return Scaffold(...);
}
)
)